BuWanVideo2.0.xcodeproj/project.pbxproj
@@ -131,6 +131,10 @@ 2DECF92D22325172002FF49F /* GuessLikeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DECF92C22325172002FF49F /* GuessLikeViewController.m */; }; 2DECF93122325854002FF49F /* GuessLTableViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DECF92F22325854002FF49F /* GuessLTableViewCell.m */; }; 2DECF93222325854002FF49F /* GuessLTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 2DECF93022325854002FF49F /* GuessLTableViewCell.xib */; }; 702904B72687016200F93618 /* PlistFileOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 702904B12687016200F93618 /* PlistFileOperator.m */; }; 702904B82687016200F93618 /* ObtainProperty.m in Sources */ = {isa = PBXBuildFile; fileRef = 702904B22687016200F93618 /* ObtainProperty.m */; }; 702904BA2687016200F93618 /* FileOperator.m in Sources */ = {isa = PBXBuildFile; fileRef = 702904B62687016200F93618 /* FileOperator.m */; }; 702904BD2687292400F93618 /* SearchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 702904BC2687292400F93618 /* SearchCell.m */; }; 7034AC8426638BF30056133F /* RecommendChangeFooterView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC8326638BF30056133F /* RecommendChangeFooterView.m */; }; 7034AC8826639A7B0056133F /* HDHeaderCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC8726639A7B0056133F /* HDHeaderCell.m */; }; 7034AC8E2663A03D0056133F /* SearchController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC8D2663A03D0056133F /* SearchController.m */; }; @@ -139,6 +143,7 @@ 7034AC992663BCF00056133F /* SearchRecordCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC982663BCF00056133F /* SearchRecordCell.m */; }; 7034AC9C2663BD650056133F /* SearchHotSearchCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC9B2663BD650056133F /* SearchHotSearchCell.m */; }; 7034AC9F2663BDFE0056133F /* SearchRecordHeaderView.m in Sources */ = {isa = PBXBuildFile; fileRef = 7034AC9E2663BDFE0056133F /* SearchRecordHeaderView.m */; }; 703B2A75269062F2001137D1 /* js.txt in Resources */ = {isa = PBXBuildFile; fileRef = 703B2A74269062F2001137D1 /* js.txt */; }; 70452819250E2C610006C95E /* libGDTMobSDK.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 7045280E250E2C5F0006C95E /* libGDTMobSDK.a */; }; 704C1489265A936B009DAB98 /* BaseController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C1488265A936B009DAB98 /* BaseController.m */; }; 704C148C265A9393009DAB98 /* RecommendMainController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C148B265A9393009DAB98 /* RecommendMainController.m */; }; @@ -152,7 +157,6 @@ 704C14BE265B72A5009DAB98 /* ZJScrollSegmentView.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14B4265B72A5009DAB98 /* ZJScrollSegmentView.m */; }; 704C14BF265B72A5009DAB98 /* ZJScrollPageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14B5265B72A5009DAB98 /* ZJScrollPageView.m */; }; 704C14C2265B7623009DAB98 /* RecommendController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14C1265B7623009DAB98 /* RecommendController.m */; }; 704C14C5265B767D009DAB98 /* LifeHomeController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14C4265B767D009DAB98 /* LifeHomeController.m */; }; 704C14C8265B76BA009DAB98 /* HDController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14C7265B76BA009DAB98 /* HDController.m */; }; 704C14CB265B76D2009DAB98 /* ListController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14CA265B76D2009DAB98 /* ListController.m */; }; 704C14CE265B8E38009DAB98 /* MainBaseController.m in Sources */ = {isa = PBXBuildFile; fileRef = 704C14CD265B8E38009DAB98 /* MainBaseController.m */; }; @@ -596,6 +600,15 @@ 2DECF92F22325854002FF49F /* GuessLTableViewCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = GuessLTableViewCell.m; sourceTree = "<group>"; }; 2DECF93022325854002FF49F /* GuessLTableViewCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = GuessLTableViewCell.xib; sourceTree = "<group>"; }; 5326AC3933907F23F3929227 /* Pods-BuWanVideo2.0.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-BuWanVideo2.0.release.xcconfig"; path = "Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.release.xcconfig"; sourceTree = "<group>"; }; 7029049E2686FA4100F93618 /* SearchDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SearchDelegate.h; sourceTree = "<group>"; }; 702904AE2687016200F93618 /* ObtainProperty.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ObtainProperty.h; sourceTree = "<group>"; }; 702904B02687016200F93618 /* FileOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FileOperator.h; sourceTree = "<group>"; }; 702904B12687016200F93618 /* PlistFileOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PlistFileOperator.m; sourceTree = "<group>"; }; 702904B22687016200F93618 /* ObtainProperty.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ObtainProperty.m; sourceTree = "<group>"; }; 702904B52687016200F93618 /* PlistFileOperator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlistFileOperator.h; sourceTree = "<group>"; }; 702904B62687016200F93618 /* FileOperator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FileOperator.m; sourceTree = "<group>"; }; 702904BB2687292400F93618 /* SearchCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SearchCell.h; sourceTree = "<group>"; }; 702904BC2687292400F93618 /* SearchCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SearchCell.m; sourceTree = "<group>"; }; 7034AC8226638BF30056133F /* RecommendChangeFooterView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecommendChangeFooterView.h; sourceTree = "<group>"; }; 7034AC8326638BF30056133F /* RecommendChangeFooterView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecommendChangeFooterView.m; sourceTree = "<group>"; }; 7034AC8626639A7B0056133F /* HDHeaderCell.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HDHeaderCell.h; sourceTree = "<group>"; }; @@ -612,6 +625,7 @@ 7034AC9B2663BD650056133F /* SearchHotSearchCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SearchHotSearchCell.m; sourceTree = "<group>"; }; 7034AC9D2663BDFE0056133F /* SearchRecordHeaderView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SearchRecordHeaderView.h; sourceTree = "<group>"; }; 7034AC9E2663BDFE0056133F /* SearchRecordHeaderView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SearchRecordHeaderView.m; sourceTree = "<group>"; }; 703B2A74269062F2001137D1 /* js.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = js.txt; sourceTree = "<group>"; }; 70452801250E2C5C0006C95E /* GDTSDKDefines.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDTSDKDefines.h; sourceTree = "<group>"; }; 70452802250E2C5C0006C95E /* GDTRewardVideoAdNetworkConnectorProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDTRewardVideoAdNetworkConnectorProtocol.h; sourceTree = "<group>"; }; 70452803250E2C5C0006C95E /* GDTMediaView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GDTMediaView.h; sourceTree = "<group>"; }; @@ -661,8 +675,6 @@ 704C14B7265B72A5009DAB98 /* ZJTitleView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZJTitleView.h; sourceTree = "<group>"; }; 704C14C0265B7623009DAB98 /* RecommendController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RecommendController.h; sourceTree = "<group>"; }; 704C14C1265B7623009DAB98 /* RecommendController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RecommendController.m; sourceTree = "<group>"; }; 704C14C3265B767D009DAB98 /* LifeHomeController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LifeHomeController.h; sourceTree = "<group>"; }; 704C14C4265B767D009DAB98 /* LifeHomeController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LifeHomeController.m; sourceTree = "<group>"; }; 704C14C6265B76BA009DAB98 /* HDController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = HDController.h; sourceTree = "<group>"; }; 704C14C7265B76BA009DAB98 /* HDController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = HDController.m; sourceTree = "<group>"; }; 704C14C9265B76D2009DAB98 /* ListController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ListController.h; sourceTree = "<group>"; }; @@ -1501,6 +1513,27 @@ path = "猜你喜欢"; sourceTree = "<group>"; }; 7029049D2686FA0000F93618 /* SearchDelegate */ = { isa = PBXGroup; children = ( 7029049E2686FA4100F93618 /* SearchDelegate.h */, ); name = SearchDelegate; sourceTree = "<group>"; }; 702904AD2687016200F93618 /* InfoPlist */ = { isa = PBXGroup; children = ( 702904AE2687016200F93618 /* ObtainProperty.h */, 702904B02687016200F93618 /* FileOperator.h */, 702904B12687016200F93618 /* PlistFileOperator.m */, 702904B22687016200F93618 /* ObtainProperty.m */, 702904B52687016200F93618 /* PlistFileOperator.h */, 702904B62687016200F93618 /* FileOperator.m */, ); path = InfoPlist; sourceTree = "<group>"; }; 7034AC85266399C70056133F /* HDController */ = { isa = PBXGroup; children = ( @@ -1532,6 +1565,7 @@ 7034AC8B2663A0200056133F /* SearchNew */ = { isa = PBXGroup; children = ( 7029049D2686FA0000F93618 /* SearchDelegate */, 7034AC932663BBCA0056133F /* Cell */, 7034AC8F2663A4060056133F /* View */, 7034AC8C2663A03D0056133F /* SearchController.h */, @@ -1552,6 +1586,8 @@ 7034AC932663BBCA0056133F /* Cell */ = { isa = PBXGroup; children = ( 702904BB2687292400F93618 /* SearchCell.h */, 702904BC2687292400F93618 /* SearchCell.m */, 7034AC942663BC400056133F /* SearchHotCell.h */, 7034AC952663BC400056133F /* SearchHotCell.m */, 7034AC972663BCF00056133F /* SearchRecordCell.h */, @@ -1587,8 +1623,6 @@ 704C148A265A9393009DAB98 /* RecommendMainController.h */, 704C148B265A9393009DAB98 /* RecommendMainController.m */, 70ED36BE2662381200E51E79 /* Recommend */, 704C14C3265B767D009DAB98 /* LifeHomeController.h */, 704C14C4265B767D009DAB98 /* LifeHomeController.m */, 7034AC85266399C70056133F /* HDController */, 7034AC8A26639BC80056133F /* ListControlelr */, ); @@ -1808,6 +1842,7 @@ 706CECD8264FB8BA001FBEB7 /* Model */ = { isa = PBXGroup; children = ( 703B2A74269062F2001137D1 /* js.txt */, 706CECD9264FB8CB001FBEB7 /* JSAPI.h */, 706CECDA264FB8CB001FBEB7 /* JSAPI.m */, ); @@ -2500,6 +2535,7 @@ AD73C5ED1D4DDBAE0060437E /* lib(第三方库) */ = { isa = PBXGroup; children = ( 702904AD2687016200F93618 /* InfoPlist */, 704C14A6265B72A5009DAB98 /* ZJScrollPageView */, 706CECCA264FB895001FBEB7 /* dsbridge */, 705F1F36251F1CA70065350E /* MJRefresh */, @@ -2721,6 +2757,7 @@ 70ED36CC26623CCC00E51E79 /* 05.jpg in Resources */, 7BC600AD1D63F560005CE8FD /* searchDetailViewController.xib in Resources */, 7B59CC141D5B16CC000B357F /* GroupfootSection.xib in Resources */, 703B2A75269062F2001137D1 /* js.txt in Resources */, 18F5CAA61E1CD25E001F526F /* allCommentsViewController.xib in Resources */, 7BA7E5C91D6BD4CB00D347D0 /* SubregionDetailViewController.xib in Resources */, 7B1FF0DA1D670B7E00E6C207 /* AttentionCell.xib in Resources */, @@ -2827,6 +2864,7 @@ inputPaths = ( "${PODS_ROOT}/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework", "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework", "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework", "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework", "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework", @@ -2838,6 +2876,7 @@ name = "[CP] Embed Pods Frameworks"; outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AFNetworking.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManager.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDAutoLayout.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SDWebImage.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/SVProgressHUD.framework", @@ -2905,10 +2944,12 @@ 706CECD5264FB895001FBEB7 /* InternalApis.m in Sources */, 7BFBC6621D6704EF0058FFEB /* LookNoteController.m in Sources */, 2D3F513821AE716F00C50FA5 /* AdCollectionViewCell.m in Sources */, 702904B82687016200F93618 /* ObtainProperty.m in Sources */, 18B1C25C1DB5B26B00AB709B /* README.md in Sources */, 18B1C2681DB5B26B00AB709B /* SlideMenuController.m in Sources */, 7034AC8426638BF30056133F /* RecommendChangeFooterView.m in Sources */, 705F1F78251F1CA80065350E /* MJRefreshAutoStateFooter.m in Sources */, 702904BA2687016200F93618 /* FileOperator.m in Sources */, 18E943E9205766510019FD04 /* subregionViewController.m in Sources */, 70ED36F9266280EA00E51E79 /* TADotView.m in Sources */, 7B0D3B2E1D59BCAB003E74A8 /* CMuneItem.m in Sources */, @@ -2936,6 +2977,7 @@ 187A74571DF79DDF001E856F /* LXAlertView.m in Sources */, 7BF526691D742C80004B9DBB /* WeiKouNetWorkRequest.m in Sources */, 18B6BE611DADC64A00DA4F63 /* Personal_informationViewController.m in Sources */, 702904B72687016200F93618 /* PlistFileOperator.m in Sources */, 7BFBC66B1D6705280058FFEB /* SystemMessageCell.m in Sources */, 18F5CA9B1E1C8895001F526F /* findcommentTableViewCell.m in Sources */, 1884A6041E545D4900548480 /* PopoverViews.m in Sources */, @@ -3030,7 +3072,6 @@ 7B41E99E1D4A04AE00F05CE2 /* main.m in Sources */, 705F1E84251F085D0065350E /* Share.m in Sources */, 7BC600A71D63F1B9005CE8FD /* searchViewController.m in Sources */, 704C14C5265B767D009DAB98 /* LifeHomeController.m in Sources */, 70ED36F7266280EA00E51E79 /* UIView+SDExtension.m in Sources */, 2DECF93122325854002FF49F /* GuessLTableViewCell.m in Sources */, 7BC24A5B1D50752B00F6D2D9 /* HeaderCollectionReusableView.m in Sources */, @@ -3071,6 +3112,7 @@ 704C14BF265B72A5009DAB98 /* ZJScrollPageView.m in Sources */, 70ED36D926624F4700E51E79 /* RecommendHeaderViewCell.m in Sources */, 7B59CC131D5B16CC000B357F /* GroupfootSection.m in Sources */, 702904BD2687292400F93618 /* SearchCell.m in Sources */, 704C1489265A936B009DAB98 /* BaseController.m in Sources */, 18ED606C1E1632E300AF8252 /* StartCollectionViewCell.m in Sources */, ); BuWanVideo2.0.xcworkspace/xcuserdata/aeline.xcuserdatad/UserInterfaceState.xcuserstateBinary files differ
BuWanVideo2.0.xcworkspace/xcuserdata/aeline.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -5,57 +5,9 @@ version = "2.0"> <Breakpoints> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "D58FFF52-3D0E-4493-8780-0C40FE4BCB90" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/PPTVController.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "150" endingLineNumber = "150" landmarkName = "-userContentController:didReceiveScriptMessage:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "05259D33-D3BF-4CE4-93E2-654B308832DD" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/PPTVController.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "105" endingLineNumber = "105" landmarkName = "PPTVController" landmarkType = "3"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "F01537B9-6B66-4C59-80F3-9A7F66813DC7" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "14" endingLineNumber = "14" landmarkName = "-tryPlayFinish" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.ExceptionBreakpoint"> <BreakpointContent uuid = "29261EEF-7821-4FCC-B006-52100113B6BC" uuid = "E0721607-A1CD-4161-BF7D-BDDDCF78C807" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" @@ -67,16 +19,64 @@ <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "4EF2693E-AD35-461F-A248-82D8240F68F4" uuid = "53D47BA7-2FA5-46A6-8A54-2C6AAEC23A51" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/Recommend/ListControlelr/ListController.m" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "86" endingLineNumber = "86" landmarkName = "-getHomeAd" startingLineNumber = "14" endingLineNumber = "14" landmarkName = "JSAPI" landmarkType = "3"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "063F8DFB-866A-417B-BC79-4A6E147FC65C" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "26" endingLineNumber = "26" landmarkName = "-playFinish:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "C7CD8336-39F9-40D9-B1D6-78F470638FE1" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "21" endingLineNumber = "21" landmarkName = "-tryPlayFinish:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> <BreakpointProxy BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> <BreakpointContent uuid = "E9279A84-5EBB-4249-9EDB-8BF23A6F9038" shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" filePath = "BuWanVideo2.0/JSAPI.m" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" startingLineNumber = "18" endingLineNumber = "18" landmarkName = "-getUserInfo:" landmarkType = "7"> </BreakpointContent> </BreakpointProxy> BuWanVideo2.0/AppDelegate.m
@@ -39,6 +39,8 @@ #import <AppTrackingTransparency/AppTrackingTransparency.h> #import <AdSupport/ASIdentifierManager.h> #import <IQKeyboardManager/IQKeyboardManager.h> #define LECUsedBundleID @"com.yeshi.buwanshequ.ios" #define TICK NSDate *startTime = [NSDate date] @@ -71,6 +73,11 @@ [self setUmeng]; //[MobClick setLogEnabled:YES]; [[IQKeyboardManager sharedManager] setEnable:YES]; [[IQKeyboardManager sharedManager] setEnableAutoToolbar:YES]; [IQKeyboardManager sharedManager].shouldResignOnTouchOutside = YES; [IQKeyboardManager sharedManager].toolbarDoneBarButtonItemText = @"完成"; //设置提示框的样式 [SVProgressHUD setDefaultStyle:SVProgressHUDStyleCustom]; @@ -92,7 +99,7 @@ //获取Uid [self getUid]; } TOCK; return YES; } BuWanVideo2.0/Assets.xcassets/Home/search_arrow.imageset/Contents.json
New file @@ -0,0 +1,22 @@ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "filename" : "search_arrow@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "search_arrow@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } BuWanVideo2.0/Assets.xcassets/Home/search_arrow.imageset/search_arrow@2x.png
BuWanVideo2.0/Assets.xcassets/Home/search_arrow.imageset/search_arrow@3x.png
BuWanVideo2.0/Assets.xcassets/Home/search_icon.imageset/Contents.json
New file @@ -0,0 +1,22 @@ { "images" : [ { "idiom" : "universal", "scale" : "1x" }, { "filename" : "search_icon@2x.png", "idiom" : "universal", "scale" : "2x" }, { "filename" : "search_icon@3x.png", "idiom" : "universal", "scale" : "3x" } ], "info" : { "author" : "xcode", "version" : 1 } } BuWanVideo2.0/Assets.xcassets/Home/search_icon.imageset/search_icon@2x.png
BuWanVideo2.0/Assets.xcassets/Home/search_icon.imageset/search_icon@3x.png
BuWanVideo2.0/Common.h
@@ -178,3 +178,6 @@ // 6.每张图片前面的前缀 #define ImageUrl @"http://sovideo.cn:8080/BuWan" #define searchRecord @"searchRecord" BuWanVideo2.0/InfoPlist/FileOperator.h
New file @@ -0,0 +1,17 @@ // // FileOperator.h // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import <Foundation/Foundation.h> @interface FileOperator : NSObject @property (nonatomic, strong) NSString *dataName; //获取文件路径 - (NSString *)dataFilePath; @end BuWanVideo2.0/InfoPlist/FileOperator.m
New file @@ -0,0 +1,20 @@ // // FileOperator.m // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import "FileOperator.h" @implementation FileOperator - (NSString *)dataFilePath { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:_dataName]; return path; } @end BuWanVideo2.0/InfoPlist/ObtainProperty.h
New file @@ -0,0 +1,18 @@ // // ObtainProperty.h // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import <Foundation/Foundation.h> @interface ObtainProperty : NSObject - (NSDictionary *)properties_aps:(id)anyClass; - (NSArray *)properties_array:(id)anyClass; //判断所有属性为空 -(BOOL)properties_nil:(id)anyClass; @end BuWanVideo2.0/InfoPlist/ObtainProperty.m
New file @@ -0,0 +1,66 @@ // // ObtainProperty.m // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import "ObtainProperty.h" #import <objc/runtime.h> @implementation ObtainProperty - (NSDictionary *)properties_aps:(id)anyClass { NSMutableDictionary *props = [NSMutableDictionary dictionary]; unsigned int outCount, i; objc_property_t *properties = class_copyPropertyList([anyClass class], &outCount); for (i = 0; i<outCount; i++) { objc_property_t property = properties[i]; const char* char_f =property_getName(property); NSString *propertyName = [NSString stringWithUTF8String:char_f]; id propertyValue = [anyClass valueForKey:(NSString *)propertyName]; if (propertyValue) [props setObject:propertyValue forKey:propertyName]; } free(properties); return props; } -(NSArray *)properties_array:(id)anyClass{ unsigned int outCount, i; NSMutableArray *properName = [[NSMutableArray alloc] init]; objc_property_t *properties = class_copyPropertyList([anyClass class], &outCount); for (i = 0; i<outCount; i++) { objc_property_t property = properties[i]; const char* char_f =property_getName(property); properName[i] = [NSString stringWithUTF8String:char_f]; } free(properties); return properName; } -(BOOL)properties_nil:(id)anyClass{ NSArray *propertiesArr = [self properties_array:anyClass]; for ( int i =0; i<propertiesArr.count; i++ ) { if ( [anyClass valueForKey:propertiesArr[i]]!=nil) { return NO; } } return YES; } @end BuWanVideo2.0/InfoPlist/PlistFileOperator.h
New file @@ -0,0 +1,26 @@ // // PlistFileOperator.h // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import "FileOperator.h" #import "ObtainProperty.h" @interface PlistFileOperator : FileOperator { ObtainProperty *property; } //写入文件 - (void)writeFileWithData:(id)obj; //读取文件数据 - (NSArray *)readFile; //删除文件 - (BOOL)deleteFile; @end BuWanVideo2.0/InfoPlist/PlistFileOperator.m
New file @@ -0,0 +1,73 @@ // // PlistFileOperator.m // YiBang // // Created by apple on 2017/9/22. // Copyright © 2017年 youmeiyi. All rights reserved. // #import "PlistFileOperator.h" @implementation PlistFileOperator -(instancetype)init{ self = [super init]; if ( self ) { property = [[ObtainProperty alloc] init]; } return self; } //写入文件 - (void)writeFileWithData:(id)obj { @autoreleasepool { NSString *filePath = [self dataFilePath]; NSArray *data = [NSArray arrayWithObject:obj]; BOOL writeSuccessBool = [data writeToFile:filePath atomically:YES]; if (writeSuccessBool == YES) { NSLog(@"写入成功"); } else { NSLog(@"写入失败"); } } } //读取文件数据 - (NSArray *)readFile { NSString *filePath = [self dataFilePath]; // DLog(@"读取filePath:%@",filePath); NSArray *data = [[NSArray alloc] initWithContentsOfFile:filePath]; return data; } - (NSArray *)readSingleFile { NSString *filePath = [self dataFilePath]; NSLog(@"读取filePath:%@",filePath); NSArray *data = [[NSArray alloc] initWithContentsOfFile:filePath]; return data; } - (BOOL)deleteFile { NSFileManager* fileManager = [NSFileManager defaultManager]; NSString *filePath = [self dataFilePath]; BOOL blHave=[[NSFileManager defaultManager] fileExistsAtPath:filePath]; if (!blHave) { return YES; } else { BOOL blDele= [fileManager removeItemAtPath:filePath error:nil]; if (blDele) { NSLog(@"dele success"); return YES; } else { NSLog(@"dele fail"); return NO; } } } @end BuWanVideo2.0/JSAPI.h
@@ -7,19 +7,10 @@ // #import <Foundation/Foundation.h> #import <JavaScriptCore/JavaScriptCore.h> NS_ASSUME_NONNULL_BEGIN @protocol JSAPIDelegate <JSExport> - (void)tryPlayFinish; @end @interface JSAPI : NSObject <JSAPIDelegate> @property (nonatomic, weak) id<JSAPIDelegate>delegate; @interface JSAPI : NSObject @end BuWanVideo2.0/JSAPI.m
@@ -10,8 +10,19 @@ @implementation JSAPI - (void)tryPlayFinish { - (NSString *)login:(NSString *)msg { return msg; } - (NSString *)getUserInfo:(NSString *)msg { return msg; } - (NSString *)tryPlayFinish:(NSString *)msg { return msg; } - (NSString *)playFinish:(NSString *)msg { return msg; } @end BuWanVideo2.0/Nethader.h
@@ -29,7 +29,7 @@ #define Search @"searchNew" #pragma mark 热门搜索 #define HotSearch @"getHotSearch" #define HotSearch @"getHotSearchNew" #pragma mark 获取相关视频 #define GetRelativeVideos @"GetRelativeVideos" BuWanVideo2.0/PPTVBottomVIpVIew.m
@@ -191,6 +191,6 @@ } - (void)onDelete { self.hidden = YES; } @end BuWanVideo2.0/PPTVController.m
@@ -11,11 +11,13 @@ #import "PPTVPppView.h" #import "PPTVBottomVIpVIew.h" #import <WebKit/WebKit.h> #import "dsbridge.h" #import "JSAPI.h" @interface PPTVController () <WKNavigationDelegate, WKUIDelegate, WKScriptMessageHandler, PPTVDelegate> @interface PPTVController () <WKNavigationDelegate, WKUIDelegate, PPTVDelegate> @property (nonatomic, nullable, strong) WKWebView *webView; @property (nonatomic, nullable, strong) DWKWebView *webView; @property (nonatomic, nullable, strong) PPTVNavView *viewPPTVNav; @property (nonatomic, nullable, strong) PPTVPppView *viewPPTVPop; @property (nonatomic, nullable, strong) PPTVBottomVIpVIew *viewPPTVVip; @@ -42,13 +44,13 @@ [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; [self.webView.configuration.userContentController addScriptMessageHandler:self name:@"tryPlayFinish"]; } - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.navigationController setNavigationBarHidden:NO animated:animated]; [self.webView.configuration.userContentController removeScriptMessageHandlerForName:@"tryPlayFinish"]; } - (void)loadViewConfig { @@ -59,7 +61,11 @@ [self.view addSubview:self.viewPPTVPop]; [self.view addSubview:self.viewPPTVVip]; self.jsAPI = [[JSAPI alloc] init]; [self.webView addJavascriptObject:[[JSAPI alloc] init] namespace:@"yestv"]; [self.webView setDebugMode:true]; [self.webView customJavascriptDialogLabelTitles:@{@"alertTitle":@"Notification",@"alertBtn":@"OK"}]; //192.168.3.135 NSString *url = self.parms[@"playUrl"]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]]; @@ -178,9 +184,14 @@ - (void)afterDelay { [self.webView evaluateJavaScript:@"javascript:adPlayFinish()" completionHandler:^(id _Nullable object, NSError * _Nullable error) {}]; NSString *str = [NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"js"ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil]; [self.webView evaluateJavaScript:str completionHandler:^(id _Nullable object, NSError * _Nullable error) { NSLog(@""); }]; } - (WKWebView *)webView { - (DWKWebView *)webView { if (!_webView) { // 0.网页配置对象 WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init]; @@ -218,7 +229,10 @@ //设置请求的User-Agent信息中应用程序名称 iOS9后可用 config.applicationNameForUserAgent = @"ChinaDailyForiPad"; _webView = [[WKWebView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.viewPPTVNav.frame), KScreenW, KScreenH - CGRectGetHeight(self.viewPPTVNav.frame)) configuration:config]; config.suppressesIncrementalRendering = YES; _webView = [[DWKWebView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.viewPPTVNav.frame), KScreenW, KScreenH - CGRectGetHeight(self.viewPPTVNav.frame)) configuration:config]; _webView.UIDelegate = self; _webView.navigationDelegate = self; // 是否允许手势左滑返回上一级, 类似导航控制的左滑返回 @@ -249,7 +263,7 @@ - (PPTVBottomVIpVIew *)viewPPTVVip { if (!_viewPPTVVip) { _viewPPTVVip = [[PPTVBottomVIpVIew alloc] initWithFrame:CGRectMake(0, 0, KScreenW, KScreenH)]; // _viewPPTVVip.hidden = YES; //_viewPPTVVip.hidden = YES; // _viewPPTVVip.delegate = self; } return _viewPPTVVip; BuWanVideo2.0/Recommend/BaseController.h
@@ -7,11 +7,14 @@ // #import <UIKit/UIKit.h> #import "PlistFileOperator.h" NS_ASSUME_NONNULL_BEGIN @interface BaseController : UIViewController @property (nonatomic, nullable, strong) PlistFileOperator *plist; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/Recommend/BaseController.m
@@ -30,4 +30,11 @@ } */ - (PlistFileOperator *)plist { if (!_plist) { _plist = [[PlistFileOperator alloc] init]; } return _plist; } @end BuWanVideo2.0/Recommend/LifeHomeController.h
File was deleted BuWanVideo2.0/Recommend/LifeHomeController.m
File was deleted BuWanVideo2.0/Recommend/ListControlelr/ListController.m
@@ -71,7 +71,7 @@ dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ [[YTHNetInterface startInterface] getRecommendCategoryVideoBannerWithUid:[YTHsharedManger startManger].Uid vtid:_parms[@"Id"] withSystem:@"1" withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { NSDictionary *dic = (NSDictionary *)result; self.dictionaryBanaer = dic[@"Data"]; @@ -82,7 +82,7 @@ dispatch_group_async(group, queue, ^{ [[YTHNetInterface startInterface] getRecommendCategoryVideoListWithUid:[YTHsharedManger startManger].Uid withVideoType:_parms[@"Id"] withSystem:@"1" withBlock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { if (_page == 1) { [self.arrayContent removeAllObjects]; @@ -90,15 +90,6 @@ self.arrayTemp = result[@"Data"][@"data"]; self.count = [result[@"Data"][@"count"] integerValue]; self.page++; if (self.count == self.arrayContent.count) { [self hideFooger]; } else { if (!self.collectionView.mj_footer) { [self setFooterRefresh]; } } } dispatch_semaphore_signal(semaphore); }]; @@ -111,6 +102,15 @@ dispatch_async(dispatch_get_main_queue(), ^{ [self.arrayContent addObjectsFromArray:self.arrayTemp]; [self.collectionView reloadData]; if (self.count == self.arrayContent.count) { [self hideFooger]; } else { if (!self.collectionView.mj_footer) { [self setFooterRefresh]; } } }); }); } @@ -184,60 +184,64 @@ } - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { return self.arrayContent.count+1; if (self.dictionaryBanaer && [self.dictionaryBanaer allKeys].count != 0) { return 2; } return 1; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { if (section == 0) { return 1; if (self.dictionaryBanaer && [self.dictionaryBanaer allKeys].count != 0) { if (section == 0) { return 1; } else { return self.arrayContent.count; } } else { NSUInteger Columns = [self.arrayContent[section-1][@"Columns"] integerValue]; if (Columns == 2 || Columns == 3) { BOOL BigPicture = [self.arrayContent[section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; if (BigPicture) { return [self.arrayContent[section-1][@"HomeVideoList"] count]-1; } return [self.arrayContent[section-1][@"HomeVideoList"] count]; } return self.arrayContent.count; } return 1; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0) { if (!self.cellRecommendHeader) { self.cellRecommendHeader = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendHeaderViewCell" forIndexPath:indexPath]; if (self.dictionaryBanaer && [self.dictionaryBanaer allKeys].count != 0) { if (indexPath.section == 0) { if (!self.cellRecommendHeader) { self.cellRecommendHeader = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendHeaderViewCell" forIndexPath:indexPath]; } self.cellRecommendHeader.arrayImageNormolData = self.dictionaryBanaer; return self.cellRecommendHeader; } else { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { RecommendThreeColumnCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendThreeColumnCell" forIndexPath:indexPath]; cell.data = self.arrayContent[indexPath.row]; return cell; } else { RecommendTwoColumnCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendTwoColumnCell" forIndexPath:indexPath]; cell.dataNormol = self.arrayContent[indexPath.row]; return cell; } } self.cellRecommendHeader.arrayImageData = self.dictionaryBanaer; return self.cellRecommendHeader; } else { NSUInteger Columns = [self.arrayContent[indexPath.section-1][@"Columns"] integerValue]; if (Columns > 3) { ToDayHotCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ToDayHotCell" forIndexPath:indexPath]; cell.data = self.arrayContent[indexPath.section-1]; return cell; } else if (Columns == 2) { RecommendTwoColumnCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendTwoColumnCell" forIndexPath:indexPath]; BOOL BigPicture = [self.arrayContent[indexPath.section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; if (BigPicture) { cell.data = self.arrayContent[indexPath.section-1][@"HomeVideoList"][indexPath.row+1][@"Video"]; } else { cell.data = self.arrayContent[indexPath.section-1][@"HomeVideoList"][indexPath.row][@"Video"]; } return cell; } else if (Columns == 3) { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { RecommendThreeColumnCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendThreeColumnCell" forIndexPath:indexPath]; BOOL BigPicture = [self.arrayContent[indexPath.section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; if (BigPicture) { cell.data = self.arrayContent[indexPath.section-1][@"HomeVideoList"][indexPath.row+1][@"Video"]; } else { cell.data = self.arrayContent[indexPath.section-1][@"HomeVideoList"][indexPath.row][@"Video"]; } cell.data = self.arrayContent[indexPath.row]; return cell; } else { RecommendTwoColumnCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendTwoColumnCell" forIndexPath:indexPath]; cell.dataNormol = self.arrayContent[indexPath.row]; return cell; } } @@ -249,28 +253,37 @@ - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if (kind == UICollectionElementKindSectionHeader) { if (indexPath.section > 0) { RecpmmendTitleView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"RecpmmendTitleView" forIndexPath:indexPath]; view.delegate = self; BOOL BigPicture = [self.arrayContent[indexPath.section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; view.isBanaer = BigPicture; view.data = self.arrayContent[indexPath.section-1]; view.index = indexPath.section; return view; } } else { if (indexPath.section > 1) { NSDictionary *data = self.arrayContent[indexPath.section-1]; if ([data[@"RefreshPosition"] integerValue] == 2) { RecommendChangeFooterView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"RecommendChangeFooterView" forIndexPath:indexPath]; if (self.dictionaryBanaer && [self.dictionaryBanaer allKeys].count != 0) { if (indexPath.section > 0) { RecpmmendTitleView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"RecpmmendTitleView" forIndexPath:indexPath]; view.delegate = self; view.data = data; view.position = indexPath.section; //BOOL BigPicture = [self.arrayContent[indexPath.section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; view.isBanaer = NO; view.titleName = @"热播推荐"; return view; } } else { RecpmmendTitleView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"RecpmmendTitleView" forIndexPath:indexPath]; view.delegate = self; //BOOL BigPicture = [self.arrayContent[indexPath.section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; view.isBanaer = NO; view.titleName = @"热播推荐"; return view; } } // else { // if (indexPath.section > 1) { // NSDictionary *data = self.arrayContent[indexPath.section-1]; // if ([data[@"RefreshPosition"] integerValue] == 2) { // RecommendChangeFooterView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"RecommendChangeFooterView" forIndexPath:indexPath]; // view.delegate = self; // view.data = data; // view.position = indexPath.section; // return view; // } // } // } UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionReusableView" forIndexPath:indexPath]; return view; @@ -279,44 +292,32 @@ - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{ //宽度随便定,系统会自动取collectionView的宽度 //高度为分组头的高度 if (section > 0) { BOOL BigPicture = [self.arrayContent[section-1][@"HomeVideoList"][0][@"BigPicture"] boolValue]; if (BigPicture) { return CGSizeMake(KScreenW, 216 + 40 + 30); if (self.dictionaryBanaer && [self.dictionaryBanaer allKeys].count != 0) { if (section > 0) { return CGSizeMake(KScreenW, 47); } } else { return CGSizeMake(KScreenW, 47); } return CGSizeMake(0, 0); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section { if (section == 0) { return CGSizeMake(CGFLOAT_MIN, CGFLOAT_MIN); } NSUInteger Columns = [self.arrayContent[section-1][@"RefreshPosition"] integerValue]; if (Columns == 2) { return CGSizeMake(KScreenW, 41); } else { return CGSizeMake(CGFLOAT_MIN, CGFLOAT_MIN); } } return CGSizeMake(CGFLOAT_MIN, CGFLOAT_MIN); } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { if (indexPath.section == 0) { CGFloat bannerSizeRate = [self.dictionaryBanaer[@"bannerSizeRate"] doubleValue]; return CGSizeMake(KScreenW, 5 + (156 * bannerSizeRate)); return CGSizeMake(KScreenW, 5 + 156); } else { NSUInteger Columns = [self.arrayContent[indexPath.section-1][@"Columns"] integerValue]; if (Columns > 3) { return CGSizeMake(KScreenW, 140); } else if (Columns == 2) { return CGSizeMake((KScreenW - 9 - 9 - 8) / 2, 140); } else if (Columns == 3) { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { return CGSizeMake((KScreenW - 9 - 9 - 6 - 6) / 3, 201); } else { return CGSizeMake((KScreenW - 9 - 9 - 8) / 2, 140); } } return CGSizeMake(KScreenW, 35); @@ -324,16 +325,16 @@ //协议中的方法,用于返回整个CollectionView上、左、下、右距四边的间距 - (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section { if (section == 0) { return UIEdgeInsetsMake(0, 0, 0, 0); } else { NSUInteger Columns = [self.arrayContent[section-1][@"Columns"] integerValue]; if (Columns == 2 || Columns == 3) { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { return UIEdgeInsetsMake(5, 9, 0, 9); } else if (Columns == 3) { } else { return UIEdgeInsetsMake(0, 9, 0, 9); } } @@ -346,12 +347,12 @@ return 0; } else { NSUInteger Columns = [self.arrayContent[section-1][@"Columns"] integerValue]; if (Columns == 2) { return 12; } else if (Columns == 3) { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { return 10; } else { return 12; } } return 0;; @@ -363,12 +364,12 @@ return 0; } else { NSUInteger Columns = [self.arrayContent[section-1][@"Columns"] integerValue]; if (Columns == 2) { return 8; } else if (Columns == 3) { NSUInteger ids = [_parms[@"Id"] integerValue]; if (ids == 150 || ids == 151 || ids == 152 ||ids == 153) { return 6; } else { return 8; } } return 0; @@ -388,18 +389,18 @@ _collectionView.delegate = self; _collectionView.delaysContentTouches = NO; _collectionView.showsVerticalScrollIndicator = NO; [_collectionView registerClass:[RecommendHeaderViewCell class] forCellWithReuseIdentifier:@"RecommendHeaderViewCell"]; [_collectionView registerClass:[ToDayHotCell class] forCellWithReuseIdentifier:@"ToDayHotCell"]; [_collectionView registerClass:[RecommendTwoColumnCell class] forCellWithReuseIdentifier:@"RecommendTwoColumnCell"]; [_collectionView registerClass:[RecommendThreeColumnCell class] forCellWithReuseIdentifier:@"RecommendThreeColumnCell"]; [_collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"UICollectionViewCell"]; [_collectionView registerClass:[RecpmmendTitleView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"RecpmmendTitleView"]; [_collectionView registerClass:[RecpmmendTitleView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"RecpmmendTitleView"]; [_collectionView registerClass:[RecommendChangeFooterView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"RecommendChangeFooterView"]; [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionReusableView"]; [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionReusableView"]; } return _collectionView; } BuWanVideo2.0/Recommend/MainBaseController.m
@@ -29,23 +29,20 @@ - (void)getHotSearch { if (![YTHsharedManger startManger].searchTitle || [[YTHsharedManger startManger].searchTitle isEqualToString:@""]) { [[YTHNetInterface startInterface] getHotSerachWithUid:[YTHsharedManger startManger].Uid withSystem:@"1" withblock:^(BOOL isSuccessful, id result, NSString *error) { [[YTHNetInterface startInterface] fetchHotSerchListWithUid:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { NSDictionary *dic = (NSDictionary *)result; if (!_dataHot) { self.dataHot = [[NSMutableArray alloc] initWithCapacity:0]; } [self.dataHot removeAllObjects]; NSArray *ar = [[dic objectForKey:@"Data"] objectForKey:@"data"]; NSArray *ar = [[dic objectForKey:@"Data"] objectForKey:@"data"][@"热搜榜"]; for (int i =0; i<ar.count; i++) { [self.dataHot addObject:[ar objectAtIndex:i]]; } NSInteger rand = arc4random()%self.dataHot.count ; self.viewRecommendNav.title = self.dataHot[rand]; [YTHsharedManger startManger].searchTitle = self.viewRecommendNav.title; } else { } }]; BuWanVideo2.0/Recommend/Recommend/Cell/RecommendHeaderViewCell.h
@@ -7,12 +7,16 @@ // #import <UIKit/UIKit.h> #import "RecommendDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface RecommendHeaderViewCell : UICollectionViewCell @property (nonatomic, weak) id<RecommendDelegate>delegate; @property (nonatomic, nullable, strong) NSDictionary *arrayImageData; @property (nonatomic, nullable, strong) NSDictionary *arrayImageNormolData; - (void)open; - (void)close; BuWanVideo2.0/Recommend/Recommend/Cell/RecommendHeaderViewCell.m
@@ -49,10 +49,10 @@ _arrayImageData = arrayImageData; if (arrayImageData) { // for (__strong UIView *view in [self.viewBG subviews]) { // [view removeFromSuperview]; // view = nil; // } // for (__strong UIView *view in [self.viewBG subviews]) { // [view removeFromSuperview]; // view = nil; // } if ([self.viewBG subviews].count != 0) { return; @@ -112,6 +112,66 @@ } } - (void)setArrayImageNormolData:(NSDictionary *)arrayImageNormolData { _arrayImageNormolData = arrayImageNormolData; if (arrayImageNormolData) { if ([self.viewBG subviews].count != 0) { return; } for (int i = 0; i < [arrayImageNormolData[@"data"] count]; i++) { [self.arrayImage addObject:arrayImageNormolData[@"data"][i][@"Picture"]]; [self.arrayData addObject:arrayImageNormolData[@"data"][i]]; } if (_arrayImage.count > 2) { CWFlowLayout *flowLayout = [[CWFlowLayout alloc] initWithStyle:CWCarouselStyle_H_1]; flowLayout.itemWidth = KScreenW - 20; flowLayout.itemSpace_H = 5; CWCarousel *carousel = [[CWCarousel alloc] initWithFrame:CGRectMake(0, 0, KScreenW, 156) delegate:self datasource:self flowLayout:flowLayout]; [self.viewBG addSubview:carousel]; carousel.isAuto = YES; carousel.endless = YES; carousel.backgroundColor = [UIColor whiteColor]; [carousel registerViewClass:[UICollectionViewCell class] identifier:@"cellId"]; [carousel freshCarousel]; [carousel.pageControl removeFromSuperview]; self.carousel = carousel; } else { CGRect frame = CGRectMake(10, 0, KScreenW - 20, 156); //if (images && images.count != 0) { SDCycleScrollView *cycleScrollView = [SDCycleScrollView cycleScrollViewWithFrame:frame delegate:self placeholderImage:BSKPlaceHolderImage]; //cycleScrollView.imageURLStringsGroup = images; cycleScrollView.localizationImageNamesGroup = _arrayImage; cycleScrollView.placeholderImage = BSKPlaceHolderImage; cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleClassic; cycleScrollView.pageControlAliment = SDCycleScrollViewPageContolAlimentCenter; cycleScrollView.autoScrollTimeInterval = 5.0f; cycleScrollView.currentPageDotColor = UICOLOR_FROM_RGB(0x159FFF, 1.0); cycleScrollView.pageDotColor = UICOLOR_FROM_RGB(0xffffff, 0.5); cycleScrollView.pageControlBottomOffset = 5; cycleScrollView.layer.masksToBounds = YES; cycleScrollView.layer.cornerRadius = 8; if (self.arrayImage.count < 2) { cycleScrollView.infiniteLoop = NO; } //[self.viewBannerBG addSubview:cycleScrollView]; [self.viewBG addSubview:cycleScrollView]; } } } - (void)open { if (self.carousel) { [self.carousel controllerWillAppear]; @@ -149,11 +209,17 @@ } - (void)CWCarousel:(CWCarousel *)carousel didSelectedAtIndex:(NSInteger)index { NSLog(@"...%ld...", (long)index); if (_delegate && [_delegate respondsToSelector:@selector(onEventBaner:)]) { [_delegate onEventBaner:self.arrayData[index]]; } } - (void)cycleScrollView:(SDCycleScrollView *)cycleScrollView didSelectItemAtIndex:(NSInteger)index { if (_delegate && [_delegate respondsToSelector:@selector(onEventBaner:)]) { [_delegate onEventBaner:self.arrayData[index]]; } } - (UIView *)viewBG { BuWanVideo2.0/Recommend/Recommend/Cell/RecommendThreeColumnCell.h
@@ -13,7 +13,7 @@ @interface RecommendThreeColumnCell : UICollectionViewCell @property (nonatomic, nullable, strong) NSDictionary *data; @property (nonatomic, nullable, strong) NSDictionary *dataNormol; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/Recommend/Recommend/Cell/RecommendThreeColumnCell.m
@@ -7,6 +7,7 @@ // #import "RecommendThreeColumnCell.h" #define BSKPlaceHolderImage [UIImage imageNamed:@"默认加载图片"] @interface RecommendThreeColumnCell () @@ -64,7 +65,7 @@ - (void)setData:(NSDictionary *)data { _data = data; if (data) { [_imaegView setYthImageWithURL:data[@"Vpicture"] placeholderImage:nil]; [_imaegView setYthImageWithURL:data[@"Vpicture"] placeholderImage:BSKPlaceHolderImage]; NSString *conetnt = data[@"Name"]; self.labelTag.text = [NSString stringWithFormat:@"%@",data[@"Tag"]]; @@ -96,7 +97,39 @@ } } - (void)setDataNormol:(NSDictionary *)dataNormol { if (dataNormol) { [_imaegView setYthImageWithURL:dataNormol[@"Vpicture"] placeholderImage:BSKPlaceHolderImage]; NSString *conetnt = dataNormol[@"Name"]; self.labelTag.text = [NSString stringWithFormat:@"%@",dataNormol[@"Tag"]]; if (dataNormol[@"Score"]) { NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@分",dataNormol[@"Score"]]]; NSRange range1 = NSMakeRange(0, 0); NSRange range2 = NSMakeRange(0, 0); if ([((NSString *)dataNormol[@"Score"]) containsString:@"."]) { range1 = [[NSString stringWithFormat:@"%@分",dataNormol[@"Score"]] rangeOfString:@"."]; range2 = NSMakeRange(range1.location+1, 2); } else { range2 = NSMakeRange(0, [NSString stringWithFormat:@"%@分",dataNormol[@"Score"]].length); } [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:9] range:range2]; [ self.labelScore setAttributedText:noteStr]; } self.labelTitle.text = conetnt; self.labelTitle.numberOfLines = 2; CGFloat height = [self fetchLabelHeight:conetnt fontSize:14 width:(KScreenW - 9 - 6 - 6 - 9) / 3]; if (height > 34) { height = 34; } self.labelTitle.sd_resetLayout.leftSpaceToView(self.contentView, 0).topSpaceToView(self.imaegView, 6).rightSpaceToView(self.contentView, 0).heightIs(height); } } - (UIImageView *)imaegView { if (!_imaegView) { BuWanVideo2.0/Recommend/Recommend/Cell/RecommendTwoColumnCell.h
@@ -14,6 +14,8 @@ @property (nonatomic, nullable, strong) NSDictionary *data; @property (nonatomic, nullable, strong) NSDictionary *dataNormol; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/Recommend/Recommend/Cell/RecommendTwoColumnCell.m
@@ -7,6 +7,7 @@ // #import "RecommendTwoColumnCell.h" #define BSKPlaceHolderImage [UIImage imageNamed:@"默认加载图片"] @interface RecommendTwoColumnCell () @@ -48,31 +49,41 @@ - (void)setData:(NSDictionary *)data { _data = data; if (data) { [_imaegView setYthImageWithURL:data[@"Hpicture"] placeholderImage:nil]; self.labelTag.text = data[@"Tag"]; if (data[@"Score"]) { NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@分",data[@"Score"]]]; NSRange range1 = [[NSString stringWithFormat:@"%@分",data[@"Score"]] rangeOfString:@"."]; NSRange range2 = NSMakeRange(range1.location+1, 2); [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:9] range:range2]; [ self.labelScore setAttributedText:noteStr]; } NSString *conetnt = data[@"Name"]; self.labelTitle.text = conetnt; self.labelTitle.numberOfLines = 2; CGFloat height = [self fetchLabelHeight:conetnt fontSize:14 width:(KScreenW - 9 - 8 - 9) / 2]; if (height > 34) { height = 34; } self.labelTitle.sd_resetLayout.leftSpaceToView(self.contentView, 0).topSpaceToView(self.imaegView, 6).rightSpaceToView(self.contentView, 0).heightIs(height); [self laodata:data]; } } - (void)setDataNormol:(NSDictionary *)dataNormol { if (_dataNormol) { [self laodata:dataNormol]; } } - (void)laodata:(NSDictionary *)data { [_imaegView setYthImageWithURL:data[@"Hpicture"] placeholderImage:BSKPlaceHolderImage]; self.labelTag.text = data[@"Tag"]; if (data[@"Score"]) { NSMutableAttributedString *noteStr = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@分",data[@"Score"]]]; NSRange range1 = [[NSString stringWithFormat:@"%@分",data[@"Score"]] rangeOfString:@"."]; NSRange range2 = NSMakeRange(range1.location+1, 2); [noteStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:9] range:range2]; [ self.labelScore setAttributedText:noteStr]; } NSString *conetnt = data[@"Name"]; self.labelTitle.text = conetnt; self.labelTitle.numberOfLines = 2; CGFloat height = [self fetchLabelHeight:conetnt fontSize:14 width:(KScreenW - 9 - 8 - 9) / 2]; if (height > 34) { height = 34; } self.labelTitle.sd_resetLayout.leftSpaceToView(self.contentView, 0).topSpaceToView(self.imaegView, 6).rightSpaceToView(self.contentView, 0).heightIs(height); } - (CGFloat)fetchLabelHeight:(NSString *)string fontSize:(NSInteger)fontSize width:(float)width { NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}; CGRect rect = [string boundingRectWithSize:CGSizeMake(width, 0) options:NSStringDrawingUsesLineFragmentOrigin | BuWanVideo2.0/Recommend/Recommend/Cell/RecpmmendTitleView.h
@@ -15,6 +15,8 @@ @property (nonatomic, weak) id<RecommendDelegate>delegate; @property (nonatomic, nullable, copy) NSString *titleName; @property (nonatomic, nullable, strong) NSDictionary *data; @property (nonatomic, assign) NSUInteger index; @@ -23,6 +25,7 @@ @property (nonatomic, nullable, strong) NSArray *arrayImage; @property (nonatomic, strong) NSIndexPath *indexPath; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/Recommend/Recommend/Cell/RecpmmendTitleView.m
@@ -8,6 +8,7 @@ #import "RecpmmendTitleView.h" #import "SDCycleScrollView.h" #define BSKPlaceHolderImage [UIImage imageNamed:@"默认加载图片"] @interface RecpmmendTitleView () <SDCycleScrollViewDelegate> @@ -76,6 +77,20 @@ _isBanaer = isBanaer; } - (void)setTitleName:(NSString *)titleName { if (titleName) { self.labelTitle.text = titleName; self.viewBanaer.hidden = YES; self.labelContent.hidden = YES; self.labelTag.hidden = YES; self.buttonChange.hidden = YES; } } - (void)setIndexPath:(NSIndexPath *)indexPath { _indexPath = indexPath; } - (void)setData:(NSDictionary *)data { _data = data; if (data) { @@ -104,7 +119,7 @@ self.labelContent.hidden = NO; self.labelTag.hidden = NO; CGRect frame = CGRectMake(10, 0, KScreenW - 20, 196); SDCycleScrollView *cycleScrollView = [SDCycleScrollView cycleScrollViewWithFrame:frame delegate:self placeholderImage:nil]; SDCycleScrollView *cycleScrollView = [SDCycleScrollView cycleScrollViewWithFrame:frame delegate:self placeholderImage:BSKPlaceHolderImage]; cycleScrollView.imageURLStringsGroup = _arrayImage; cycleScrollView.pageControlStyle = SDCycleScrollViewPageContolStyleClassic; cycleScrollView.pageControlAliment = SDCycleScrollViewPageContolAlimentCenter; @@ -136,6 +151,9 @@ // if (_delegate && [_delegate respondsToSelector:@selector(touchTopBanner:)]) { // [_delegate touchTopBanner:dictionary]; // } if (_delegate && [_delegate respondsToSelector:@selector(onEventHeaderSection:)]) { [_delegate onEventHeaderSection:_indexPath]; } } BuWanVideo2.0/Recommend/Recommend/Cell/ToDayHotCell.h
@@ -7,13 +7,18 @@ // #import <UIKit/UIKit.h> #import "RecommendDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface ToDayHotCell : UICollectionViewCell @property (nonatomic, weak) id<RecommendDelegate>delegate; @property (nonatomic, nullable, strong) NSDictionary *data; @property (nonatomic, assign) NSInteger section; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/Recommend/Recommend/Cell/ToDayHotCell.m
@@ -51,6 +51,8 @@ NSDictionary *video = homeVideoList[i][@"Video"]; UIView *viewBG = [[UIView alloc] init]; viewBG.userInteractionEnabled = YES; viewBG.tag = i; [self.scrollView addSubview:viewBG]; viewBG.sd_layout.leftSpaceToView(self.scrollView, 9 + 150 * i + 8 * i).topSpaceToView(self.scrollView, 0).widthIs(150).bottomSpaceToView(self.scrollView, 0); @@ -78,12 +80,27 @@ labelTitle.sd_layout.leftSpaceToView(viewBG, 0).topSpaceToView(imgView, 6).rightSpaceToView(viewBG, 0).heightIs(height); [imgView setYthImageWithURL:video[@"Picture"] placeholderImage:nil]; UITapGestureRecognizer *ges = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchHot:)]; [viewBG addGestureRecognizer:ges]; } self.scrollView.contentSize = CGSizeMake(9 + 150 * homeVideoList.count + 8 * (homeVideoList.count-1) + 9, 140); } } - (void)touchHot:(UIGestureRecognizer *)ges { NSArray *homeVideoList = _data[@"HomeVideoList"]; NSDictionary *video = homeVideoList[ges.view.tag][@"Video"]; if (_delegate && [_delegate respondsToSelector:@selector(onEventHotSection:)]) { [_delegate onEventHotSection:video]; } } - (void)setSection:(NSInteger)section { _section = section; } - (CGFloat)fetchLabelHeight:(NSString *)string fontSize:(NSInteger)fontSize width:(float)width { NSDictionary *dic = @{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}; CGRect rect = [string boundingRectWithSize:CGSizeMake(width, 0) options:NSStringDrawingUsesLineFragmentOrigin | BuWanVideo2.0/Recommend/Recommend/Delegate/RecommendDelegate.h
@@ -14,6 +14,11 @@ - (void)onEventChange:(NSString *)vid page:(NSUInteger)page index:(NSInteger)index pages:(NSString *)pages; - (void)onEventHeaderSection:(NSIndexPath *)indexpath; - (void)onEventHotSection:(NSDictionary *)parms; - (void)onEventBaner:(NSDictionary *)parms; @end BuWanVideo2.0/Recommend/Recommend/RecommendController.m
@@ -7,6 +7,9 @@ // #import "RecommendController.h" #import "OnlySpecialController.h"//专辑视图 #import "XYRDetailViewController.h" #import "RecommendHeaderViewCell.h" #import "ToDayHotCell.h" #import "RecommendTwoColumnCell.h" @@ -64,6 +67,7 @@ } -(void)getHomeAd{ [SVProgressHUD show]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 创建全局并行 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); @@ -111,6 +115,7 @@ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; [self.arrayContent addObjectsFromArray:self.arrayTemp]; [self.collectionView reloadData]; }); @@ -168,6 +173,62 @@ [self changeData:vid page:page index:index]; } - (void)onEventHeaderSection:(NSIndexPath *)indexpath { if (indexpath.section == 1) { return; } [self cellClick:indexpath]; } - (void)onEventHotSection:(NSDictionary *)parms { XYRDetailViewController *play = [[XYRDetailViewController alloc]init]; [YTHsharedManger startManger].preController = [self fetchCurrentViewController]; play.modalPresentationStyle = 0; play.Model = [XYRVideoInfoModel yy_modelWithDictionary:parms]; [[self fetchCurrentViewController] presentViewController:play animated:YES completion:^{}]; } - (void)onEventBaner:(NSDictionary *)parms { NSInteger LinkType = [parms[@"LinkType"] integerValue]; if (LinkType == 1) {//普通视频跳转 XYRDetailViewController *play = [[XYRDetailViewController alloc]init]; [YTHsharedManger startManger].preController = [self fetchCurrentViewController]; NSString *video = @""; video = @"VideoInfo"; play.modalPresentationStyle = 0; play.Model = [XYRVideoInfoModel yy_modelWithDictionary:parms[@"Video"]]; [[self fetchCurrentViewController] presentViewController:play animated:YES completion:^{}]; } else if (LinkType == 2){//网页(网页) NSString *s = [parms[@"Params"] stringByReplacingOccurrencesOfString:@"\\"withString:@""]; NSDictionary *Params = [self dictionaryWithJsonString:s]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:[Params objectForKey:@"url"]]]; } else if (LinkType == 3){//专辑 OnlySpecialController *OnlySpecial =[OnlySpecialController new]; OnlySpecial.Id = [parms[@"Id"] intValue]; [[self fetchCurrentViewController].navigationController pushViewController:OnlySpecial animated:YES]; } } #pragma mark 把json格式的字符串转换为字典格式 - (NSDictionary *)dictionaryWithJsonString:(NSString *)jsonString { if (jsonString == nil) { return nil; } NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding]; NSError *err; NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&err]; if(err) { NSLog(@"json解析失败:%@",err); return nil; } return dic; } - (void)hideFooger { self.collectionView.mj_footer = nil; } @@ -180,9 +241,53 @@ }]; } - (void)setHeaderRefresh { self.collectionView.mj_header=[MJRefreshNormalHeader headerWithRefreshingBlock:^{ self.page = 1; [self loadFooter:^{ }]; }]; } - (void)cellClick:(NSIndexPath *)indexPath { NSDictionary *parms = [NSDictionary new]; parms = self.arrayContent[indexPath.section-1][@"HomeVideoList"][indexPath.row][@"Video"]; XYRDetailViewController *play = [[XYRDetailViewController alloc]init]; [YTHsharedManger startManger].preController = [self fetchCurrentViewController]; play.modalPresentationStyle = 0; play.Model = [XYRVideoInfoModel yy_modelWithDictionary:parms]; [[self fetchCurrentViewController] presentViewController:play animated:YES completion:^{}]; } - (UIViewController *)fetchCurrentViewController { UIViewController* currentViewController = [UIApplication sharedApplication].keyWindow.rootViewController; BOOL runLoopFind = YES; while (runLoopFind) { if (currentViewController.presentedViewController) { currentViewController = currentViewController.presentedViewController; } else if ([currentViewController isKindOfClass:[UINavigationController class]]) { UINavigationController* navigationController = (UINavigationController* )currentViewController; currentViewController = [navigationController.childViewControllers lastObject]; } else if ([currentViewController isKindOfClass:[UITabBarController class]]) { UITabBarController* tabBarController = (UITabBarController* )currentViewController; currentViewController = tabBarController.selectedViewController; } else { NSUInteger childViewControllerCount = currentViewController.childViewControllers.count; if (childViewControllerCount > 0) { currentViewController = currentViewController.childViewControllers.lastObject; return currentViewController; } else { return currentViewController; } } } return currentViewController; } #pragma mark UICollectionViewDelegate, UICollectionViewDataSource - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { //[self cellClick:indexPath]; [self cellClick:indexPath]; } - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { @@ -211,12 +316,14 @@ if (!self.cellRecommendHeader) { self.cellRecommendHeader = [collectionView dequeueReusableCellWithReuseIdentifier:@"RecommendHeaderViewCell" forIndexPath:indexPath]; } self.cellRecommendHeader.delegate = self; self.cellRecommendHeader.arrayImageData = self.dictionaryBanaer; return self.cellRecommendHeader; } else { NSUInteger Columns = [self.arrayContent[indexPath.section-1][@"Columns"] integerValue]; if (Columns > 3) { ToDayHotCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ToDayHotCell" forIndexPath:indexPath]; cell.delegate = self; cell.data = self.arrayContent[indexPath.section-1]; return cell; @@ -258,6 +365,7 @@ view.isBanaer = BigPicture; view.data = self.arrayContent[indexPath.section-1]; view.index = indexPath.section; view.indexPath = indexPath; return view; } @@ -402,6 +510,8 @@ [_collectionView registerClass:[RecommendChangeFooterView class] forSupplementaryViewOfKind:UICollectionElementKindSectionFooter withReuseIdentifier:@"RecommendChangeFooterView"]; [_collectionView registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionReusableView"]; [self setHeaderRefresh]; } return _collectionView; } BuWanVideo2.0/Recommend/RecommendMainController.m
@@ -9,7 +9,6 @@ #import "RecommendMainController.h" #import "RecommendController.h" #import "LifeHomeController.h" #import "HDController.h" #import "ListController.h" BuWanVideo2.0/Recommend/lib/SDCycleScrollView/SDCycleScrollView.m
@@ -596,7 +596,9 @@ if (!self.onlyDisplayText && [imagePath isKindOfClass:[NSString class]]) { if ([imagePath hasPrefix:@"http"]) { [cell.imageView sd_setImageWithURL:[NSURL URLWithString:imagePath] placeholderImage:self.placeholderImage]; //[cell.imageView sd_setImageWithURL:[NSURL URLWithString:imagePath] placeholderImage:self.placeholderImage]; [cell.imageView setYthImageWithURL:imagePath placeholderImage:self.placeholderImage]; } else { UIImage *image = [UIImage imageNamed:imagePath]; if (!image) { BuWanVideo2.0/SearchCell.h
New file @@ -0,0 +1,19 @@ // // SearchCell.h // BuWanVideo2.0 // // Created by Aeline on 2021/6/26. // Copyright © 2021 com.yeshi.buwansheque.ios. All rights reserved. // #import <UIKit/UIKit.h> NS_ASSUME_NONNULL_BEGIN @interface SearchCell : UITableViewCell @property (nonatomic, nullable, copy) NSString *title; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/SearchCell.m
New file @@ -0,0 +1,104 @@ // // SearchCell.m // BuWanVideo2.0 // // Created by Aeline on 2021/6/26. // Copyright © 2021 com.yeshi.buwansheque.ios. All rights reserved. // #import "SearchCell.h" @interface SearchCell () @property (nonatomic, nullable, strong) UIImageView *imageViewIcon; @property (nonatomic, nullable, strong) UILabel *labelTitle; @property (nonatomic, nullable, strong) UIImageView *imageViewArrow; @property (nonatomic, nullable, strong) UIView *line; @end @implementation SearchCell - (void)awakeFromNib { [super awakeFromNib]; // Initialization code } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.contentView.backgroundColor = [UIColor whiteColor]; self.selectionStyle = UITableViewCellSelectionStyleNone;//设置cell点击效果 [self setupViewConfig]; } return self; } - (void)setupViewConfig { [self.contentView addSubview:self.imageViewIcon]; [self.contentView addSubview:self.imageViewArrow]; [self.contentView addSubview:self.labelTitle]; [self.contentView addSubview:self.line]; self.imageViewIcon.sd_layout.leftSpaceToView(self.contentView, 18).centerYEqualToView(self.contentView).widthIs(18).heightIs(18); self.imageViewArrow.sd_layout.rightSpaceToView(self.contentView, 18).centerYEqualToView(self.contentView).widthIs(15).heightIs(15); self.labelTitle.sd_layout.leftSpaceToView(self.imageViewIcon, 17).rightSpaceToView(self.imageViewArrow, 17).centerYEqualToView(self.contentView).heightIs(15); self.line.sd_layout.leftSpaceToView(self.contentView, 18).bottomEqualToView(self.contentView).rightSpaceToView(self.contentView, 18).heightIs(0.5); } - (void)setTitle:(NSString *)title { _title = title; if (title) { self.labelTitle.text = title; } } - (UIImageView *)imageViewIcon { if (!_imageViewIcon) { _imageViewIcon = [[UIImageView alloc] init]; _imageViewIcon.image = [UIImage imageNamed:@"search_icon"]; } return _imageViewIcon; } - (UILabel *)labelTitle { if (!_labelTitle) { _labelTitle = [[UILabel alloc] init]; _labelTitle.textColor = UICOLOR_FROM_RGB(0x000000, 1); _labelTitle.font = [UIFont systemFontOfSize:15]; _labelTitle.textAlignment = NSTextAlignmentLeft; } return _labelTitle; } - (UIImageView *)imageViewArrow { if (!_imageViewArrow) { _imageViewArrow = [[UIImageView alloc] init]; _imageViewArrow.image = [UIImage imageNamed:@"search_arrow"]; } return _imageViewArrow; } - (UIView *)line { if (!_line) { _line = [[UIView alloc] init]; _line.backgroundColor = UICOLOR_FROM_RGB(0xDFDFDF, 1); } return _line; } @end BuWanVideo2.0/SearchController.h
@@ -7,10 +7,11 @@ // #import <UIKit/UIKit.h> #import "BaseController.h" NS_ASSUME_NONNULL_BEGIN @interface SearchController : UIViewController @interface SearchController : BaseController @property (nonatomic, nullable, copy) NSString *ptitle; BuWanVideo2.0/SearchController.m
@@ -7,7 +7,10 @@ // #import "SearchController.h" #import "searchDetailViewController.h" #import "SearchNavView.h" #import "SearchCell.h" #import "SearchHotCell.h" #import "SearchRecordCell.h" #import "SearchHotSearchCell.h" @@ -15,14 +18,17 @@ #import "UICollectionViewLeftAlignedLayout.h" @interface SearchController () <UICollectionViewDelegate, UICollectionViewDataSource> @interface SearchController () <UICollectionViewDelegate, UICollectionViewDataSource, SearchDelegate, UITableViewDelegate, UITableViewDataSource> @property (nonatomic, strong) SearchNavView *viewSearchNav; @property (nonatomic, nullable, strong) UICollectionView *collectionView; @property (nonatomic, nullable, strong) UITableView *tableView;//模糊搜索弹出的表格 @property (nonatomic, nullable, strong) NSMutableArray *arrayHot; @property (nonatomic, nullable, strong) NSMutableArray *arrayRecord; @property (nonatomic, nullable, strong) NSDictionary *dictionaryHotSerch; @property (nonatomic, nullable, strong) NSMutableArray *arraySearch; @end @implementation SearchController @@ -37,6 +43,11 @@ [super viewWillDisappear:animated]; } - (void)dealloc { } - (void)viewDidLoad { [super viewDidLoad]; [self setupDataConfig]; @@ -45,21 +56,55 @@ } - (void)setupDataConfig { for (int i = 0; i < 10; i++) { [self.arrayRecord addObject:@"二十不惑"]; } self.plist.dataName = searchRecord; [self.arrayRecord addObjectsFromArray:[self.plist readFile][0]]; } - (void)loadData { [[YTHNetInterface startInterface] fetchHotSerchListWithUid:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { self.dictionaryHotSerch = result[@"Data"][@"data"]; __weak typeof(self) weakSelf = self; dispatch_async(dispatch_get_main_queue(), ^{ [weakSelf.collectionView reloadData]; }); } }]; [SVProgressHUD show]; dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); // 创建全局并行 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ [[YTHNetInterface startInterface] getHotSerachWithUid:[YTHsharedManger startManger].Uid withSystem:@"1" withblock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { NSDictionary *dic = (NSDictionary *)result; NSArray *ar = [[dic objectForKey:@"Data"] objectForKey:@"data"]; for (int i =0; i < ar.count; i++) { [self.arrayHot addObject:ar[i]]; } } else { if ([error compare:@"似乎已断开与互联网的连接。"] == 0) { [self autoDisappearAlertTime:1 msg:@"网络不可用,请检查网络"]; } } dispatch_semaphore_signal(semaphore); }]; }); dispatch_group_async(group, queue, ^{ [[YTHNetInterface startInterface] fetchHotSerchListWithUid:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { self.dictionaryHotSerch = result[@"Data"][@"data"]; } dispatch_semaphore_signal(semaphore); }]; }); dispatch_group_notify(group, queue, ^{ dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_async(dispatch_get_main_queue(), ^{ [SVProgressHUD dismiss]; [self.collectionView reloadData]; }); }); } - (void)setupViewConfig { @@ -69,11 +114,89 @@ __weak typeof(self) weakSelf = self; self.viewSearchNav.onCacel = ^{ [weakSelf.view endEditing:YES]; [weakSelf.navigationController popViewControllerAnimated:YES]; if (weakSelf.tableView.hidden) { [weakSelf.view endEditing:YES]; [weakSelf.navigationController popViewControllerAnimated:YES]; } else { weakSelf.tableView.hidden = YES; } }; [self.view addSubview:self.collectionView]; [self.view addSubview:self.tableView]; } - (void)writeSearchKey:(NSString *)name { self.plist.dataName = searchRecord; NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[self.plist readFile][0]]; [array removeObject:name]; [array insertObject:name atIndex:0]; if (array.count > 10) { [array removeLastObject]; } [self.plist writeFileWithData:array]; } - (void)pushDetail:(NSString *)name { searchDetailViewController *vc = [[searchDetailViewController alloc] init]; vc.searchString = name; [self.navigationController pushViewController:vc animated:YES]; } /// 根据输入框的值搜索数据 /// @param text key - (void)fetchSearchWithKey:(NSString *)text { [[YTHNetInterface startInterface] getSuggestSearchWithUid:[YTHsharedManger startManger].Uid withKey:text withSystem:@"1" withPage:@"1" withblock:^(BOOL isSuccessful, id result, NSString *error) { if (isSuccessful) { [self.arraySearch removeAllObjects]; NSArray *suggestSearch = [[result objectForKey:@"Data"] objectForKey:@"data"]; [self.arraySearch addObjectsFromArray:suggestSearch]; [self.tableView reloadData]; } }]; } #pragma mark ---------- SearchDelegate --------- - (void)hotSearchEvent:(NSString *)name { [self writeSearchKey:name]; [self pushDetail:name]; [self.arrayRecord removeObject:name]; [self.arrayRecord insertObject:name atIndex:0]; if (_arrayRecord.count > 10) { [self.arrayRecord removeLastObject]; } [self.collectionView reloadData]; } - (void)deleteRecordEvent { self.plist.dataName = searchRecord; [self.plist deleteFile]; [self.arrayRecord removeAllObjects]; [self.collectionView reloadData]; } - (void)textFieldSearch:(NSString *)text { if (!text || [text isEqualToString:@""]) { [SVProgressHUD showErrorWithStatus:@"请输入搜索内容"]; return; } [self.view endEditing:YES]; [self hotSearchEvent:text]; } - (void)textFieldValueChange:(NSString *)text { if (text.length > 0) { [self fetchSearchWithKey:text]; self.tableView.hidden = NO; } else { self.tableView.hidden = YES; } } - (CGFloat)calculateRowWidth:(NSString *)string fontSize:(float)fontSize height:(float)height { @@ -83,9 +206,16 @@ return rect.size.width; } - (void)cellClick:(NSIndexPath *)indexPath { if (indexPath.section == 1) { NSString *name = _arrayRecord[indexPath.row]; [self hotSearchEvent:name]; } } #pragma mark UICollectionViewDelegate, UICollectionViewDataSource - (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath { //[self cellClick:indexPath]; [self cellClick:indexPath]; } - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView { @@ -97,7 +227,7 @@ return 0; } else if (section == 1) { return _arrayRecord.count; return self.arrayRecord.count; } else { return 1; @@ -116,6 +246,7 @@ } else { SearchHotSearchCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"SearchHotSearchCell" forIndexPath:indexPath]; cell.delegate = self; cell.data = _dictionaryHotSerch; return cell; } @@ -125,12 +256,12 @@ - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath { if (kind == UICollectionElementKindSectionHeader) { if (indexPath.section == 1) { if (indexPath.section == 1 && self.arrayRecord.count != 0) { SearchRecordHeaderView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"SearchRecordHeaderView" forIndexPath:indexPath]; view.delegate = self; return view; } } UICollectionReusableView *view = [collectionView dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"UICollectionReusableView" forIndexPath:indexPath]; return view; } @@ -142,6 +273,9 @@ return CGSizeMake(KScreenW, 10); } else if (section == 1) { if (self.arrayRecord.count == 0) { return CGSizeMake(KScreenW, 0); } return CGSizeMake(KScreenW, 20 + 16 + 16); } return CGSizeMake(KScreenW, 28); @@ -218,9 +352,54 @@ return _collectionView; } #pragma mark UITableViewDelegate UITableViewDataSource - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self.view endEditing:YES]; self.tableView.hidden = YES; NSString *name = _arraySearch[indexPath.row]; [self hotSearchEvent:name]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.arraySearch.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { NSString *cellIden = @"searchCell"; SearchCell *cell = [tableView dequeueReusableCellWithIdentifier: cellIden]; if (!cell){ cell = [[SearchCell alloc] initWithStyle: UITableViewCellStyleDefault reuseIdentifier: cellIden]; } cell.title = _arraySearch[indexPath.row]; return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 55; } - (UITableView *)tableView { if (!_tableView) { _tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, kStatusBarH + ALNavBarH, KScreenW, KScreenH - kStatusBarH - ALNavBarH)]; _tableView.delegate = self; _tableView.dataSource = self; _tableView.estimatedRowHeight = 0; _tableView.estimatedSectionFooterHeight = 0; _tableView.estimatedSectionHeaderHeight = 0; _tableView.backgroundColor = [UIColor whiteColor]; _tableView.separatorStyle = UITableViewCellSeparatorStyleNone; _tableView.showsVerticalScrollIndicator = YES; _tableView.hidden = YES; } return _tableView; } - (SearchNavView *)viewSearchNav { if (!_viewSearchNav) { _viewSearchNav = [[SearchNavView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, kStatusBarH + ALNavBarH)]; _viewSearchNav.delegate = self; } return _viewSearchNav; } @@ -239,4 +418,11 @@ return _arrayHot; } - (NSMutableArray *)arraySearch { if (!_arraySearch) { _arraySearch = [[NSMutableArray alloc] init]; } return _arraySearch; } @end BuWanVideo2.0/SearchDelegate.h
New file @@ -0,0 +1,23 @@ // // SearchDelegate.h // BuWanVideo2.0 // // Created by Aeline on 2021/6/26. // Copyright © 2021 com.yeshi.buwansheque.ios. All rights reserved. // #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN @protocol SearchDelegate <NSObject> - (void)hotSearchEvent:(NSString *)name; - (void)deleteRecordEvent; - (void)textFieldSearch:(NSString *)text; - (void)textFieldValueChange:(NSString *)text; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/SearchHotSearchCell.h
@@ -7,11 +7,14 @@ // #import <UIKit/UIKit.h> #import "SearchDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface SearchHotSearchCell : UICollectionViewCell @property (nonatomic, weak) id<SearchDelegate>delegate; @property (nonatomic, nullable, strong) NSDictionary *data; @end BuWanVideo2.0/SearchHotSearchCell.m
@@ -91,7 +91,6 @@ } else { labelNumber.backgroundColor = UICOLOR_FROM_RGB(0xC2C2C2, 1); } labelNumber.sd_layout.leftSpaceToView(viewBG, 16).topSpaceToView(viewBG, 49 + 17 * j + 11 * j).widthIs(17).heightIs(17); UILabel *labelName = [[UILabel alloc] init]; labelName.text = name; @@ -99,16 +98,26 @@ labelName.textColor = [UIColor blackColor]; labelName.font = [UIFont boldSystemFontOfSize:12]; [viewBG addSubview:labelName]; UIButton *buttonTap = [UIButton buttonWithType:UIButtonTypeCustom]; buttonTap.titleLabel.text = name; [viewBG addSubview:buttonTap]; if (j > 4) { labelNumber.sd_layout.leftSpaceToView(viewBG, 152).topSpaceToView(viewBG, 49 + 17 * (j - 5) + 11 * (j - 5)).widthIs(17).heightIs(17); labelName.sd_layout.leftSpaceToView(labelNumber, 13).centerYEqualToView(labelNumber).widthIs(90).heightIs(17); buttonTap.sd_layout.leftSpaceToView(viewBG, 152).topSpaceToView(viewBG, 49 + 17 * (j - 5) + 11 * (j - 5)).widthIs(120).heightIs(17); } else { labelNumber.sd_layout.leftSpaceToView(viewBG, 16).topSpaceToView(viewBG, 49 + 17 * j + 11 * j).widthIs(17).heightIs(17); labelName.sd_layout.leftSpaceToView(labelNumber, 13).centerYEqualToView(labelNumber).widthIs(100).heightIs(17); buttonTap.sd_layout.leftSpaceToView(viewBG, 16).topSpaceToView(viewBG, 49 + 17 * j + 11 * j).widthIs(130).heightIs(17); } labelNumber.sd_cornerRadius = @4; [buttonTap addTarget:self action:@selector(touchTitle:) forControlEvents:UIControlEventTouchUpInside]; } } @@ -116,6 +125,13 @@ } } - (void)touchTitle:(UIButton *)button { NSString *title = button.titleLabel.text; if (_delegate && [_delegate respondsToSelector:@selector(hotSearchEvent:)]) { [_delegate hotSearchEvent:title]; } } - (UIScrollView *)scrollView { if (!_scrollView) { _scrollView = [[UIScrollView alloc] init]; BuWanVideo2.0/SearchNavView.h
@@ -7,6 +7,7 @@ // #import <UIKit/UIKit.h> #import "SearchDelegate.h" NS_ASSUME_NONNULL_BEGIN @@ -14,8 +15,12 @@ @interface SearchNavView : UIView @property (nonatomic, weak) id<SearchDelegate>delegate; @property (nonatomic, nullable, copy) NSString *title; @property (nonatomic, nullable, copy) NSString *text; @property (nonatomic) onCacel onCacel; @end BuWanVideo2.0/SearchNavView.m
@@ -8,7 +8,7 @@ #import "SearchNavView.h" @interface SearchNavView () @interface SearchNavView () <UITextFieldDelegate> @property (nonatomic, strong) UIView *viewNav; @property (nonatomic, strong) UIView *viewSearch; @@ -21,6 +21,7 @@ - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { self.backgroundColor = [UIColor whiteColor]; [self setupViewConfig]; } return self; @@ -50,6 +51,8 @@ [self.viewSearch addSubview:self.textField]; self.textField.sd_layout.leftSpaceToView(imageViewSearch, 8).centerYEqualToView(self.viewSearch).rightSpaceToView(self.viewSearch, 0).heightIs(34); [self.textField addTarget:self action:@selector(searchValueChanged:) forControlEvents:UIControlEventEditingChanged];//添加实时的检测值事件 } - (void)touchCacel { @@ -65,6 +68,39 @@ value:UICOLOR_FROM_RGB(0x787878, 1.0) range:NSMakeRange(0, string.length)]; _textField.attributedPlaceholder = placeholder; } } - (void)setText:(NSString *)text { _text = text; if (text) { NSString *string = @"请输入搜索内容"; NSMutableAttributedString *placeholder = [[NSMutableAttributedString alloc] initWithString:string]; [placeholder addAttribute:NSForegroundColorAttributeName value:UICOLOR_FROM_RGB(0x787878, 1.0) range:NSMakeRange(0, string.length)]; _textField.attributedPlaceholder = placeholder; _textField.text = text; } } - (BOOL)textFieldShouldReturn:(UITextField *)textField { NSString *text = textField.text; if (_title) { if ([text isEqualToString:@""] || !text) { text = textField.placeholder; } } if (_delegate && [_delegate respondsToSelector:@selector(textFieldSearch:)]) { [_delegate textFieldSearch:text]; } return YES; } - (void)searchValueChanged:(UITextField *)textField { if ([_delegate respondsToSelector:@selector(textFieldValueChange:)]) { [self.delegate textFieldValueChange:textField.text]; } } @@ -89,6 +125,9 @@ _textField.font = [UIFont systemFontOfSize:14]; _textField.textAlignment = NSTextAlignmentLeft; _textField.textColor = [UIColor blackColor]; _textField.returnKeyType = UIReturnKeySearch;//变为搜索按钮 _textField.delegate = self; _textField.clearButtonMode = UITextFieldViewModeAlways; } return _textField; } BuWanVideo2.0/SearchRecordHeaderView.h
@@ -7,11 +7,14 @@ // #import <UIKit/UIKit.h> #import "SearchDelegate.h" NS_ASSUME_NONNULL_BEGIN @interface SearchRecordHeaderView : UICollectionReusableView @property (nonatomic, weak) id<SearchDelegate>delegate; @end NS_ASSUME_NONNULL_END BuWanVideo2.0/SearchRecordHeaderView.m
@@ -34,6 +34,12 @@ self.buttonDelete.sd_layout.rightSpaceToView(self, 10).centerYEqualToView(self.labelTitle).widthIs(30).heightIs(30); } - (void)toucnDeleteRecord { if (_delegate && [_delegate respondsToSelector:@selector(deleteRecordEvent)]) { [_delegate deleteRecordEvent]; } } - (UILabel *)labelTitle { if (!_labelTitle) { _labelTitle = [[UILabel alloc] init]; @@ -49,6 +55,7 @@ if (!_buttonDelete) { _buttonDelete = [UIButton buttonWithType:UIButtonTypeCustom]; [_buttonDelete setImage:[UIImage imageNamed:@"search_delete"] forState:UIControlStateNormal]; [_buttonDelete addTarget:self action:@selector(toucnDeleteRecord) forControlEvents:UIControlEventTouchUpInside]; } return _buttonDelete; } BuWanVideo2.0/js.txt
New file @@ -0,0 +1,3 @@ var bridge={default:this,call:function(i,s,t){var d,e="";return"function"==typeof s&&(t=s,s={}),s={data:void 0===s?null:s},"function"==typeof t&&(d="dscb"+window.dscb++,window[d]=t,s._dscbstub=d),s=JSON.stringify(s),window._dsbridge?e=_dsbridge.call(i,s):!window._dswk&&-1==navigator.userAgent.indexOf("_dsbridge")||(e=prompt("_dsbridge="+i,s)),JSON.parse(e||"{}").data},register:function(i,s,t){t=t?window._dsaf:window._dsf,window._dsInit||(window._dsInit=!0,setTimeout(function(){bridge.call("_dsb.dsinit")},0)),"object"==typeof s?t._obs[i]=s:t[i]=s},registerAsyn:function(i,s){this.register(i,s,!0)},hasNativeMethod:function(i,s){return this.call("_dsb.hasNativeMethod",{name:i,type:s||"all"})},disableJavascriptDialogBlock:function(i){this.call("_dsb.disableJavascriptDialogBlock",{disable:!1!==i})}};!function(){if(!window._dsf){var i,s={_dsf:{_obs:{}},_dsaf:{_obs:{}},dscb:0,dsBridge:bridge,close:function(){bridge.call("_dsb.closePage")},_handleMessageFromNative:function(i){function s(i,s){n.data=i.apply(s,e),bridge.call("_dsb.returnValue",n)}function t(i,s){e.push(function(i,s){n.data=i,n.complete=!1!==s,bridge.call("_dsb.returnValue",n)}),i.apply(s,e)}var d,e=JSON.parse(i.data),n={id:i.callbackId,complete:!0},o=this._dsf[i.method],a=this._dsaf[i.method];o?s(o,this._dsf):a?t(a,this._dsaf):(o=i.method.split(".")).length<2||(i=o.pop(),o=o.join("."),(d=(a=(a=this._dsf._obs)[o]||{})[i])&&"function"==typeof d?s(d,a):(d=(a=(a=this._dsaf._obs)[o]||{})[i])&&"function"==typeof d&&t(d,a))}};for(i in s)window[i]=s[i];bridge.register("_hasJavascriptMethod",function(i,s){return(s=i.split(".")).length<2?!(!_dsf[s]&&!_dsaf[s]):(i=s.pop(),s=s.join("."),(s=_dsf._obs[s]||_dsaf._obs[s])&&!!s[i])})}}(); var ppyestv={login:function(){bridge.call("yestv.login")},getUserInfo:function(){return bridge.call("yestv.getUserInfo")},tryPlayFinish:function(){bridge.call("yestv.tryPlayFinish")},playFinish:function(){bridge.call("yestv.playFinish")}}; BuWanVideo2.0/searchDetailViewController.h
@@ -7,8 +7,9 @@ // #import <UIKit/UIKit.h> #import "BaseController.h" @interface searchDetailViewController : UIViewController @interface searchDetailViewController : BaseController @property (nonatomic , strong) NSString *searchString;//搜索框上面的搜索字符串 BuWanVideo2.0/searchDetailViewController.m
@@ -10,6 +10,7 @@ #import "YTHSearchTextField.h" #import "searchTableViewCell.h" #import "SearchDetailListCell.h" #import "SearchCell.h" #import "XYRDetailViewController.h" //#import "GDTNativeAd.h" @@ -18,11 +19,12 @@ #import "GDTNativeExpressAdView.h" #import "SearchTitleView.h" #import "SearchNavView.h" static NSString *indentfly = @"cell"; static NSString *indentfly2=@"searchTableViewCellID"; @interface searchDetailViewController ()<YTHSearchTextFieldDelegate,UITableViewDataSource,UITableViewDelegate,GDTNativeExpressAdDelegete,SearchDetailListCellDelegate,SearchTitleViewDelegate>{ @interface searchDetailViewController ()<YTHSearchTextFieldDelegate,UITableViewDataSource,UITableViewDelegate,GDTNativeExpressAdDelegete,SearchDetailListCellDelegate,SearchTitleViewDelegate, SearchDelegate>{ NSInteger pagenumber; NSInteger typenumber; //广点通原生广告 @@ -42,6 +44,8 @@ @property (nonatomic, strong) SearchTitleView *viewSearchTitle; @property (nonatomic, strong) NSArray *typeList; @property (nonatomic, strong) SearchNavView *viewSearchNav; @end @implementation searchDetailViewController @@ -60,63 +64,63 @@ } - (void)viewWillAppear:(BOOL)animated { - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self.navigationController setNavigationBarHidden:YES animated:animated]; self.navigationController.navigationBar.translucent = NO; } - (void)viewWillDisappear:(BOOL)animated { - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; } /** * 设置导航栏 */ - (void)setNavgtionView { UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenW-115, 30)]; YTHSearchTextField *searchField = [[YTHSearchTextField alloc] initWithFrame:CGRectMake(0, 0, titleView.frame.size.width, titleView.frame.size.height)]; searchField.delegate = self; self.searchField = searchField; searchField.layer.cornerRadius =searchField.frame.size.height / 2; searchField.layer.masksToBounds = YES; searchField.backgroundColor = [UIColor colorWithWhite:0.7 alpha:0.2]; [titleView addSubview:searchField]; self.navigationItem.titleView = titleView; //取消输入框的第一响应事件 [searchField.Field resignFirstResponder]; searchField.Field.text = self.searchString; //加载用户搜索的数据 //[self loadSearchData]; //定制返回按钮 UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 50)]; [backBtn setTitle:@"返回" forState:UIControlStateNormal]; backBtn.titleLabel.font=[UIFont systemFontOfSize:14]; [backBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; [backBtn addTarget:self action:@selector(backToMainVC:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *backItem=[[UIBarButtonItem alloc] initWithCustomView:backBtn]; //添加返回按钮到导航栏 self.navigationItem.leftBarButtonItem=backItem; //定制搜索按钮 UIButton *searchBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; [searchBtn setImage:[UIImage imageNamed:@"搜索按钮"] forState:UIControlStateNormal]; [searchBtn addTarget:self action:@selector(search:) forControlEvents:UIControlEventTouchUpInside]; UIBarButtonItem *searchItem=[[UIBarButtonItem alloc] initWithCustomView:searchBtn]; //添加搜索按钮 self.navigationItem.rightBarButtonItem=searchItem; self.view.backgroundColor = kGlobalBackgroundColor; [self.view addSubview:self.viewSearchTitle]; // UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenW-115, 30)]; // YTHSearchTextField *searchField = [[YTHSearchTextField alloc] initWithFrame:CGRectMake(0, 0, titleView.frame.size.width, titleView.frame.size.height)]; // // searchField.delegate = self; // self.searchField = searchField; // searchField.layer.cornerRadius =searchField.frame.size.height / 2; // searchField.layer.masksToBounds = YES; // searchField.backgroundColor = [UIColor colorWithWhite:0.7 alpha:0.2]; // // [titleView addSubview:searchField]; // self.navigationItem.titleView = titleView; // //取消输入框的第一响应事件 // [searchField.Field resignFirstResponder]; // // searchField.Field.text = self.searchString; // // //加载用户搜索的数据 // //[self loadSearchData]; // // //定制返回按钮 // UIButton *backBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 50)]; // [backBtn setTitle:@"返回" forState:UIControlStateNormal]; // backBtn.titleLabel.font=[UIFont systemFontOfSize:14]; // [backBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; // [backBtn addTarget:self action:@selector(backToMainVC:) forControlEvents:UIControlEventTouchUpInside]; // UIBarButtonItem *backItem=[[UIBarButtonItem alloc] initWithCustomView:backBtn]; // // //添加返回按钮到导航栏 // self.navigationItem.leftBarButtonItem=backItem; // // //定制搜索按钮 // UIButton *searchBtn=[[UIButton alloc] initWithFrame:CGRectMake(0, 0, 30, 30)]; // [searchBtn setImage:[UIImage imageNamed:@"搜索按钮"] forState:UIControlStateNormal]; // [searchBtn addTarget:self action:@selector(search:) forControlEvents:UIControlEventTouchUpInside]; // UIBarButtonItem *searchItem=[[UIBarButtonItem alloc] initWithCustomView:searchBtn]; // // //添加搜索按钮 // self.navigationItem.rightBarButtonItem=searchItem; // // self.view.backgroundColor = kGlobalBackgroundColor; // // [self.view addSubview:self.viewSearchTitle]; } /** @@ -173,17 +177,33 @@ /** * 添加用于显示的列表 */ -(void)addTabelView { - (void)addTabelView { [self.view addSubview:self.viewSearchNav]; self.viewSearchNav.text = _searchString; __weak typeof(self) weakSelf = self; self.viewSearchNav.onCacel = ^{ [SVProgressHUD dismiss]; if (weakSelf.suggestTableview.hidden) { [weakSelf.view endEditing:YES]; [weakSelf.navigationController popViewControllerAnimated:YES]; } else { weakSelf.suggestTableview.hidden = YES; weakSelf.DisplayTabelView.hidden = NO; } }; if(!self.DisplayTabelView) { CGFloat height = 64; if (KIsiPhoneX) { height = 84; } self.DisplayTabelView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, KScreenW, KScreenH - height - 40) style:UITableViewStyleGrouped]; self.DisplayTabelView = [[UITableView alloc] initWithFrame:CGRectMake(0, kStatusBarH + ALNavBarH, KScreenW, KScreenH - kStatusBarH - ALNavBarH) style:UITableViewStyleGrouped]; } self.DisplayTabelView.delegate=self; self.DisplayTabelView.dataSource=self; //tableView背景色 self.DisplayTabelView.backgroundColor = [UIColor whiteColor]; self.DisplayTabelView.separatorStyle = UITableViewCellSeparatorStyleNone; @@ -207,15 +227,45 @@ //请求数据 [self loadSearchData:NO]; }]; [self loadSearchData:YES]; //[self.DisplayTabelView.mj_header beginRefreshing]; } #pragma mark --------- SearchDelegate --------- - (void)textFieldSearch:(NSString *)text { if ([text isEqualToString:@""] || !text) { return; } [self.view endEditing:YES]; if (text.length > 0) { _dataSearch = nil; self.searchString = text; [self.DisplayTabelView setHidden:NO]; [self.suggestTableview setHidden:YES]; [self.DisplayTabelView.mj_header beginRefreshing]; } else { //提示用户搜索内容不能为空 } } - (void)textFieldValueChange:(NSString *)text { if (text.length > 0) {//有值 [self getSuggestSearchWithKey:text]; self.DisplayTabelView.hidden = YES; self.suggestTableview.hidden = NO; } else {//没有值 self.DisplayTabelView.hidden = NO; self.suggestTableview.hidden = YES; } } /// 请求搜索数据 /// @param isSearch 是不是搜索来的数据 -(void)loadSearchData:(BOOL)isSearch { [self searchDataWithText:self.searchField.Field.text withType:typenumber withPage:pagenumber :isSearch]; [self searchDataWithText:_searchString withType:typenumber withPage:pagenumber :isSearch]; } /** @@ -226,11 +276,12 @@ if (KIsiPhoneX) { spaceTop = 84; } UITableView *suggestTableview = [[UITableView alloc]initWithFrame:CGRectMake(0, 0, KScreenW, KScreenH - spaceTop) style:UITableViewStyleGrouped]; UITableView *suggestTableview = [[UITableView alloc]initWithFrame:CGRectMake(0, kStatusBarH + ALNavBarH, KScreenW, KScreenH - kStatusBarH - ALNavBarH) style:UITableViewStyleGrouped]; [suggestTableview setBackgroundColor:[UIColor whiteColor]]; suggestTableview.delegate = self; suggestTableview.dataSource = self; suggestTableview.hidden = YES; suggestTableview.separatorStyle = UITableViewCellSeparatorStyleNone; _suggestTableview = suggestTableview; [self.view addSubview:suggestTableview]; } @@ -303,7 +354,7 @@ //没有数据,需要告诉用户 } ++pagenumber; pagenumber++; [self.DisplayTabelView.mj_header endRefreshing]; [self.DisplayTabelView.mj_footer endRefreshing]; [self.DisplayTabelView reloadData]; @@ -368,12 +419,12 @@ /*************(以下)协议*****************/ #pragma mark -YTHSearchTextFieldDelegate - (void)YTHSearchField:(YTHSearchTextField *)searchField SearchValueChanged:(UITextField *)textField{//实时监控 if (textField.text.length>0) {//有值 [self getSuggestSearchWithKey:textField.text]; [self.DisplayTabelView setHidden:YES]; self.suggestTableview.hidden = NO; }else{//没有值 } else {//没有值 [self.DisplayTabelView setHidden:NO]; self.suggestTableview.hidden = YES; } @@ -387,7 +438,8 @@ [self.suggestTableview setHidden:YES]; [self.DisplayTabelView.mj_header beginRefreshing]; [self.DisplayTabelView reloadData]; }else{ } else { //提示用户搜索内容不能为空 } return YES; @@ -419,12 +471,12 @@ } } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ if (tableView==self.suggestTableview) { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:indentfly]; if (tableView == self.suggestTableview) { SearchCell *cell = [tableView dequeueReusableCellWithIdentifier:indentfly]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:indentfly]; cell = [[SearchCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:indentfly]; } cell.textLabel.text = [_suggestSearch objectAtIndex:indexPath.section]; cell.title = _suggestSearch[indexPath.section]; return cell; } else { @@ -486,16 +538,17 @@ return CGFLOAT_MIN; } - (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section{ UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, KScreenW, 0.5)]; UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, KScreenW, CGFLOAT_MIN)]; view.backgroundColor = [UIColor clearColor]; return view; } - (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ if (section % 20 == 0 && self.expressAdViews.count != 0) { if (section % 20 == 0 && self.expressAdViews.count != 0 && tableView != self.suggestTableview) { NSInteger infoIndex; if (self.expressAdViews.count <= (section / 20)) { infoIndex = (section/20)%self.expressAdViews.count; }else{ } else { infoIndex = section / 20; } GDTNativeExpressAdView *adView = (GDTNativeExpressAdView *)self.expressAdViews[infoIndex]; @@ -506,7 +559,7 @@ } } - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ if (section %20 == 0 && self.expressAdViews.count != 0) { if (section %20 == 0 && self.expressAdViews.count != 0 && tableView != self.suggestTableview) { NSInteger infoIndex; if (self.expressAdViews.count <= (section / 20)) { infoIndex = (section/20)%self.expressAdViews.count; @@ -516,7 +569,7 @@ GDTNativeExpressAdView *adView = (GDTNativeExpressAdView *)self.expressAdViews[infoIndex]; adView.backgroundColor = kGlobalBackgroundColor; return adView; }else{ } else { UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, KScreenW, 0)]; return view; } @@ -525,7 +578,7 @@ - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ if(tableView == self.suggestTableview) { return 44; return 55; } else { XYRVideoInfoModel *model = [XYRVideoInfoModel yy_modelWithDictionary:_dataSearch[indexPath.section]]; @@ -543,11 +596,10 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ [tableView deselectRowAtIndexPath:indexPath animated:YES]; if(tableView==self.suggestTableview){ _searchField.Field.text = [_suggestSearch objectAtIndex:indexPath.section]; [self searchCotol:_searchField.Field.text]; //[self.DisplayTabelView.mj_header beginRefreshing]; [self searchDataWithText:self.searchField.Field.text withType:typenumber withPage:1 :YES]; if(tableView == self.suggestTableview){ NSString *name = [_suggestSearch objectAtIndex:indexPath.section]; [self textFieldSearch:name]; [self searchDataWithText:name withType:typenumber withPage:1 :YES]; } else { XYRVideoInfoModel *model = [XYRVideoInfoModel yy_modelWithDictionary:_dataSearch[indexPath.section]]; @@ -563,6 +615,14 @@ } } - (SearchNavView *)viewSearchNav { if (!_viewSearchNav) { _viewSearchNav = [[SearchNavView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, kStatusBarH + ALNavBarH)]; _viewSearchNav.delegate = self; } return _viewSearchNav; } - (SearchTitleView *)viewSearchTitle { if (!_viewSearchTitle) { _viewSearchTitle = [[SearchTitleView alloc] initWithFrame:CGRectMake(0, 0, KScreenW, 40)]; Podfile
@@ -5,7 +5,7 @@ target 'BuWanVideo2.0' do pod 'SVProgressHUD' pod 'AFNetworking','~>3.0' pod 'YYWebImage' pod 'YYImage/WebP' @@ -16,5 +16,6 @@ pod 'UMCCommon' pod 'SDAutoLayout' pod 'IQKeyboardManager' pod 'SVProgressHUD' end Podfile.lock
@@ -14,6 +14,7 @@ - AFNetworking/Serialization (3.1.0) - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - IQKeyboardManager (3.3.7) - SDAutoLayout (2.2.1) - SDWebImage (4.4.0): - SDWebImage/Core (= 4.4.0) @@ -33,6 +34,7 @@ DEPENDENCIES: - AFNetworking (~> 3.0) - IQKeyboardManager - SDAutoLayout - SDWebImage - SVProgressHUD @@ -44,6 +46,7 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - AFNetworking - IQKeyboardManager - SDAutoLayout - SDWebImage - SVProgressHUD @@ -55,6 +58,7 @@ SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 IQKeyboardManager: 249c3946acf61345c18b038eb50863fe2793e3a8 SDAutoLayout: 8bf6b3bbc8b01f775d4defbb4fda2ace805461be SDWebImage: b534502786e43dde36dfcaee89356fe6df30e203 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 @@ -64,6 +68,6 @@ YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 PODFILE CHECKSUM: f1f331d7ce40276e3e5cab6707de67dbda4a3be9 PODFILE CHECKSUM: d781d1544c8f8305855b93dab835453200677052 COCOAPODS: 1.10.1 Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQNSArray+Sort.h
New file @@ -0,0 +1,45 @@ // // NSArray+Sort.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <Foundation/NSArray.h> /** UIView.subviews sorting category. */ @interface NSArray (IQ_NSArray_Sort) ///-------------- /// @name Sorting ///-------------- /** Returns the array by sorting the UIView's by their tag property. */ - (nonnull NSArray*)sortedArrayByTag; /** Returns the array by sorting the UIView's by their tag property. */ - (nonnull NSArray*)sortedArrayByPosition; @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQNSArray+Sort.m
New file @@ -0,0 +1,71 @@ // // NSArray+Sort.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQNSArray+Sort.h" #import "IQUIView+Hierarchy.h" #import <UIKit/UIView.h> @implementation NSArray (IQ_NSArray_Sort) - (NSArray*)sortedArrayByTag { return [self sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { if ([view1 respondsToSelector:@selector(tag)] && [view2 respondsToSelector:@selector(tag)]) { if ([view1 tag] < [view2 tag]) return NSOrderedAscending; else if ([view1 tag] > [view2 tag]) return NSOrderedDescending; else return NSOrderedSame; } else return NSOrderedSame; }]; } - (NSArray*)sortedArrayByPosition { return [self sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { CGFloat x1 = CGRectGetMinX(view1.frame); CGFloat y1 = CGRectGetMinY(view1.frame); CGFloat x2 = CGRectGetMinX(view2.frame); CGFloat y2 = CGRectGetMinY(view2.frame); 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; }]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIScrollView+Additions.h
New file @@ -0,0 +1,35 @@ // // IQUIScrollView+Additions.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIKit.h> @interface UIScrollView (Additions) /** Restore scrollViewContentOffset when resigning from scrollView. Default is NO. */ @property(nonatomic, assign) BOOL shouldRestoreScrollViewContentOffset; @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIScrollView+Additions.m
New file @@ -0,0 +1,41 @@ // // IQUIScrollView+Additions.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUIScrollView+Additions.h" #import <objc/runtime.h> @implementation UIScrollView (Additions) -(void)setShouldRestoreScrollViewContentOffset:(BOOL)shouldRestoreScrollViewContentOffset { objc_setAssociatedObject(self, @selector(shouldRestoreScrollViewContentOffset), @(shouldRestoreScrollViewContentOffset), OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(BOOL)shouldRestoreScrollViewContentOffset { NSNumber *shouldRestoreScrollViewContentOffset = objc_getAssociatedObject(self, @selector(shouldRestoreScrollViewContentOffset)); return [shouldRestoreScrollViewContentOffset boolValue]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUITextFieldView+Additions.h
New file @@ -0,0 +1,46 @@ // // IQUITextFieldView+Additions.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIKit.h> /** UIView category for managing UITextField/UITextView */ @interface UIView (Additions) /** To set customized distance from keyboard for textField/textView. Can't be less than zero */ @property(nonatomic, assign) CGFloat keyboardDistanceFromTextField; @end ///------------------------------------------- /// @name Custom KeyboardDistanceFromTextField ///------------------------------------------- /** Uses default keyboard distance for textField. */ extern CGFloat const kIQUseDefaultKeyboardDistance; Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUITextFieldView+Additions.m
New file @@ -0,0 +1,54 @@ // // IQUITextFieldView+Additions.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUITextFieldView+Additions.h" #import <objc/runtime.h> @implementation UIView (Additions) -(void)setKeyboardDistanceFromTextField:(CGFloat)keyboardDistanceFromTextField { //Can't be less than zero. Minimum is zero. keyboardDistanceFromTextField = MAX(keyboardDistanceFromTextField, 0); objc_setAssociatedObject(self, @selector(keyboardDistanceFromTextField), [NSNumber numberWithFloat:keyboardDistanceFromTextField], OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(CGFloat)keyboardDistanceFromTextField { NSNumber *keyboardDistanceFromTextField = objc_getAssociatedObject(self, @selector(keyboardDistanceFromTextField)); return (keyboardDistanceFromTextField)?[keyboardDistanceFromTextField floatValue]:kIQUseDefaultKeyboardDistance; } @end ///------------------------------------ /// @name keyboardDistanceFromTextField ///------------------------------------ /** Uses default keyboard distance for textField. */ CGFloat const kIQUseDefaultKeyboardDistance = CGFLOAT_MAX; Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIView+Hierarchy.h
New file @@ -0,0 +1,131 @@ // // UIView+Hierarchy.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIView.h> #import "IQKeyboardManagerConstants.h" @class UICollectionView, UIScrollView, UITableView, NSArray; /** UIView hierarchy category. */ @interface UIView (IQ_UIView_Hierarchy) ///------------------------------ /// @name canBecomeFirstResponder ///------------------------------ /** Returns YES if IQKeyboardManager asking for `canBecomeFirstResponder. Useful when doing custom work in `textFieldShouldBeginEditing:` delegate. */ @property (nonatomic, readonly) BOOL isAskingCanBecomeFirstResponder; ///---------------------- /// @name viewControllers ///---------------------- /** Returns the UIViewController object that manages the receiver. */ @property (nullable, nonatomic, readonly, strong) UIViewController *viewController; /** Returns the topMost UIViewController object in hierarchy. */ @property (nullable, nonatomic, readonly, strong) UIViewController *topMostController; ///----------------------------------- /// @name Superviews/Subviews/Siglings ///----------------------------------- /** Returns the superView of provided class type. */ -(nullable UIView*)superviewOfClassType:(nonnull Class)classType; /** Returns all siblings of the receiver which canBecomeFirstResponder. */ @property (nonnull, nonatomic, readonly, copy) NSArray *responderSiblings; /** Returns all deep subViews of the receiver which canBecomeFirstResponder. */ @property (nonnull, nonatomic, readonly, copy) NSArray *deepResponderViews; ///------------------------- /// @name Special TextFields ///------------------------- /** Returns YES if the receiver object is UISearchBarTextField, otherwise return NO. */ @property (nonatomic, getter=isSearchBarTextField, readonly) BOOL searchBarTextField; /** Returns YES if the receiver object is UIAlertSheetTextField, otherwise return NO. */ @property (nonatomic, getter=isAlertViewTextField, readonly) BOOL alertViewTextField; ///---------------- /// @name Transform ///---------------- /** Returns current view transform with respect to the 'toView'. */ -(CGAffineTransform)convertTransformToView:(nullable UIView*)toView; ///----------------- /// @name Hierarchy ///----------------- /** Returns a string that represent the information about it's subview's hierarchy. You can use this method to debug the subview's positions. */ @property (nonnull, nonatomic, readonly, copy) NSString *subHierarchy; /** Returns an string that represent the information about it's upper hierarchy. You can use this method to debug the superview's positions. */ @property (nonnull, nonatomic, readonly, copy) NSString *superHierarchy; /** Returns an string that represent the information about it's frame positions. You can use this method to debug self positions. */ @property (nonnull, nonatomic, readonly, copy) NSString *debugHierarchy; @end /** NSObject category to used for logging purposes */ @interface NSObject (IQ_Logging) /** Short description for logging purpose. */ @property (nonnull, nonatomic, readonly, copy) NSString *_IQDescription; @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIView+Hierarchy.m
New file @@ -0,0 +1,325 @@ // // UIView+Hierarchy.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUIView+Hierarchy.h" #import <UIKit/UICollectionView.h> #import <UIKit/UITableView.h> #import <UIKit/UITextView.h> #import <UIKit/UITextField.h> #import <UIKit/UISearchBar.h> #import <UIKit/UIViewController.h> #import <UIKit/UIWindow.h> #import <objc/runtime.h> #import "IQNSArray+Sort.h" @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), [NSNumber numberWithBool:isAskingCanBecomeFirstResponder], OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(BOOL)isAskingCanBecomeFirstResponder { NSNumber *isAskingCanBecomeFirstResponder = objc_getAssociatedObject(self, @selector(isAskingCanBecomeFirstResponder)); return [isAskingCanBecomeFirstResponder boolValue]; } -(UIViewController*)viewController { UIResponder *nextResponder = self; do { nextResponder = [nextResponder nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) return (UIViewController*)nextResponder; } while (nextResponder != nil); return nil; } -(UIViewController *)topMostController { NSMutableArray *controllersHierarchy = [[NSMutableArray alloc] init]; UIViewController *topController = self.window.rootViewController; if (topController) { [controllersHierarchy addObject:topController]; } while ([topController presentedViewController]) { topController = [topController presentedViewController]; [controllersHierarchy addObject:topController]; } UIResponder *matchController = [self viewController]; while (matchController != nil && [controllersHierarchy containsObject:matchController] == NO) { do { matchController = [matchController nextResponder]; } while (matchController != nil && [matchController isKindOfClass:[UIViewController class]] == NO); } return (UIViewController*)matchController; } -(UIView*)superviewOfClassType:(Class)classType { UIView *superview = self.superview; while (superview) { if ([superview isKindOfClass:classType] && ([superview isKindOfClass:UITableViewCellScrollViewClass] == NO) && ([superview isKindOfClass:UITableViewWrapperViewClass] == NO) && ([superview isKindOfClass:UIQueuingScrollViewClass] == NO)) { return superview; } else superview = superview.superview; } return nil; } -(BOOL)_IQcanBecomeFirstResponder { [self _setIsAskingCanBecomeFirstResponder:YES]; BOOL _IQcanBecomeFirstResponder = ([self canBecomeFirstResponder] && [self isUserInteractionEnabled] && ![self isHidden] && [self alpha]!=0.0 && ![self isAlertViewTextField] && ![self isSearchBarTextField]); if (_IQcanBecomeFirstResponder == YES) { if ([self isKindOfClass:[UITextField class]]) { _IQcanBecomeFirstResponder = [(UITextField*)self isEnabled]; } else if ([self isKindOfClass:[UITextView class]]) { _IQcanBecomeFirstResponder = [(UITextView*)self isEditable]; } } [self _setIsAskingCanBecomeFirstResponder:NO]; return _IQcanBecomeFirstResponder; } - (NSArray*)responderSiblings { // Getting all siblings NSArray *siblings = self.superview.subviews; //Array of (UITextField/UITextView's). NSMutableArray *tempTextFields = [[NSMutableArray alloc] init]; for (UITextField *textField in siblings) if ([textField _IQcanBecomeFirstResponder]) [tempTextFields addObject:textField]; return tempTextFields; } - (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) { if ([textField _IQcanBecomeFirstResponder]) { [textFields addObject:textField]; } else if (textField.subviews.count) { [textFields addObjectsFromArray:[textField deepResponderViews]]; } } return textFields; } -(CGAffineTransform)convertTransformToView:(UIView*)toView { if (toView == nil) { toView = self.window; } CGAffineTransform myTransform = CGAffineTransformIdentity; //My Transform { UIView *superView = [self superview]; if (superView) myTransform = CGAffineTransformConcat(self.transform, [superView convertTransformToView:nil]); else myTransform = self.transform; } CGAffineTransform viewTransform = CGAffineTransformIdentity; //view Transform { UIView *superView = [toView superview]; if (superView) viewTransform = CGAffineTransformConcat(toView.transform, [superView convertTransformToView:nil]); else if (toView) viewTransform = toView.transform; } return CGAffineTransformConcat(myTransform, CGAffineTransformInvert(viewTransform)); } - (NSInteger)depth { NSInteger depth = 0; if ([self superview]) { depth = [[self superview] depth] + 1; } return depth; } - (NSString *)subHierarchy { NSMutableString *debugInfo = [[NSMutableString alloc] initWithString:@"\n"]; NSInteger depth = [self depth]; for (int counter = 0; counter < depth; counter ++) [debugInfo appendString:@"| "]; [debugInfo appendString:[self debugHierarchy]]; for (UIView *subview in self.subviews) { [debugInfo appendString:[subview subHierarchy]]; } return debugInfo; } - (NSString *)superHierarchy { NSMutableString *debugInfo = [[NSMutableString alloc] init]; if (self.superview) { [debugInfo appendString:[self.superview superHierarchy]]; } else { [debugInfo appendString:@"\n"]; } NSInteger depth = [self depth]; for (int counter = 0; counter < depth; counter ++) [debugInfo appendString:@"| "]; [debugInfo appendString:[self debugHierarchy]]; [debugInfo appendString:@"\n"]; return debugInfo; } -(NSString *)debugHierarchy { NSMutableString *debugInfo = [[NSMutableString alloc] init]; [debugInfo appendFormat:@"%@: ( %.0f, %.0f, %.0f, %.0f )",NSStringFromClass([self class]), CGRectGetMinX(self.frame), CGRectGetMinY(self.frame), CGRectGetWidth(self.frame), CGRectGetHeight(self.frame)]; if ([self isKindOfClass:[UIScrollView class]]) { UIScrollView *scrollView = (UIScrollView*)self; [debugInfo appendFormat:@"%@: ( %.0f, %.0f )",NSStringFromSelector(@selector(contentSize)),scrollView.contentSize.width,scrollView.contentSize.height]; } if (CGAffineTransformEqualToTransform(self.transform, CGAffineTransformIdentity) == false) { [debugInfo appendFormat:@"%@: %@",NSStringFromSelector(@selector(transform)),NSStringFromCGAffineTransform(self.transform)]; } return debugInfo; } -(BOOL)isSearchBarTextField { return ([self isKindOfClass:UISearchBarTextFieldClass] || [self isKindOfClass:[UISearchBar class]]); } -(BOOL)isAlertViewTextField { return ([self isKindOfClass:UIAlertSheetTextFieldClass] || [self isKindOfClass:UIAlertSheetTextFieldClass_iOS8]); } @end @implementation NSObject (IQ_Logging) -(NSString *)_IQDescription { return [NSString stringWithFormat:@"<%@ %p>",NSStringFromClass([self class]),self]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIViewController+Additions.h
New file @@ -0,0 +1,33 @@ // // IQUIViewController+Additions.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIKit.h> @interface UIViewController (Additions) /** Top/Bottom Layout constraint which help library to manage keyboardTextField distance */ @property(nullable, nonatomic, strong) IBOutlet NSLayoutConstraint *IQLayoutGuideConstraint; @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIViewController+Additions.m
New file @@ -0,0 +1,39 @@ // // IQUIViewController+Additions.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUIViewController+Additions.h" #import <objc/runtime.h> @implementation UIViewController (Additions) -(void)setIQLayoutGuideConstraint:(NSLayoutConstraint *)IQLayoutGuideConstraint { objc_setAssociatedObject(self, @selector(IQLayoutGuideConstraint), IQLayoutGuideConstraint, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSLayoutConstraint *)IQLayoutGuideConstraint { return objc_getAssociatedObject(self, @selector(IQLayoutGuideConstraint)); } @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.h
New file @@ -0,0 +1,48 @@ // // UIWindow+Hierarchy.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIWindow.h> @class UIViewController; /** UIWindow hierarchy category. */ @interface UIWindow (IQ_UIWindow_Hierarchy) ///---------------------- /// @name viewControllers ///---------------------- /** Returns the current Top Most ViewController in hierarchy. */ @property (nullable, nonatomic, readonly, strong) UIViewController *topMostController; /** Returns the topViewController in stack of topMostController. */ @property (nullable, nonatomic, readonly, strong) UIViewController *currentViewController; @end Pods/IQKeyboardManager/IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.m
New file @@ -0,0 +1,51 @@ // // UIWindow+Hierarchy.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUIWindow+Hierarchy.h" #import <UIKit/UINavigationController.h> @implementation UIWindow (IQ_UIWindow_Hierarchy) - (UIViewController*)topMostController { UIViewController *topController = [self rootViewController]; // Getting topMost ViewController while ([topController presentedViewController]) topController = [topController presentedViewController]; // Returning topMost ViewController return topController; } - (UIViewController*)currentViewController; { UIViewController *currentViewController = [self topMostController]; while ([currentViewController isKindOfClass:[UINavigationController class]] && [(UINavigationController*)currentViewController topViewController]) currentViewController = [(UINavigationController*)currentViewController topViewController]; return currentViewController; } @end Pods/IQKeyboardManager/IQKeyBoardManager/Constants/IQKeyboardManagerConstants.h
New file @@ -0,0 +1,147 @@ // // IQKeyboardManagerConstants.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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. #ifndef IQKeyboardManagerConstants_h #define IQKeyboardManagerConstants_h #import <Foundation/NSObjCRuntime.h> ///---------------- /// @name Debugging ///---------------- /** Set IQKEYBOARDMANAGER_DEBUG=1 in preprocessor macros under build settings to enable debugging. */ ///----------------------------------- /// @name IQAutoToolbarManageBehaviour ///----------------------------------- /** `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. */ typedef NS_ENUM(NSInteger, IQAutoToolbarManageBehaviour) { IQAutoToolbarBySubviews, IQAutoToolbarByTag, IQAutoToolbarByPosition, }; ///------------------- /// @name Localization ///------------------- #define IQLocalizedString(key, comment) [[NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"IQKeyboardManager" ofType:@"bundle"]] localizedStringForKey:(key) value:@"" table:@"IQKeyboardManager"] /* XCode 5.0 Compatibility for NS_DESIGNATED_INITIALIZER*/ #ifndef NS_DESIGNATED_INITIALIZER #if __has_attribute(objc_designated_initializer) #define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer)) #else #define NS_DESIGNATED_INITIALIZER #endif #endif #endif /* /---------------------------------------------------------------------------------------------------\ \---------------------------------------------------------------------------------------------------/ | iOS NSNotification Mechanism | /---------------------------------------------------------------------------------------------------\ \---------------------------------------------------------------------------------------------------/ 1) Begin Editing:- When TextField begin editing. 2) End Editing:- When TextField end editing. 3) Switch TextField:- When Keyboard Switch from a TextField to another TextField. 3) Orientation Change:- When Device Orientation Change. ---------------------------------------------------------------------------------------------------------------------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------------------------------------------------------------------------------------------------- ============= UITextField ============= Begin Editing Begin Editing -------------------------------------------- ---------------------------------- --------------------------------- |UITextFieldTextDidBeginEditingNotification| --------> | UIKeyboardWillShowNotification | --------> | UIKeyboardDidShowNotification | -------------------------------------------- ---------------------------------- --------------------------------- ^ Switch TextField ^ Switch TextField | | | | | Switch TextField | Orientation Change | | | | | | -------------------------------------------- | ---------------------------------- --------------------------------- | UITextFieldTextDidEndEditingNotification | <-------- | UIKeyboardWillHideNotification | --------> | UIKeyboardDidHideNotification | -------------------------------------------- ---------------------------------- --------------------------------- | End Editing ^ | | |--------------------End Editing-------------------------------------------------------------| ---------------------------------------------------------------------------------------------------------------------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------------------------------------------------------------------------------------------------- ============= UITextView ============= |-------------------Switch TextView--------------------------------------------------------------| | |------------------Begin Editing-------------------------------------------------------------| | | | | | v | Begin Editing Switch TextView v | -------------------------------------------- ---------------------------------- --------------------------------- | UITextViewTextDidBeginEditingNotification| <-------- | UIKeyboardWillShowNotification | --------> | UIKeyboardDidShowNotification | -------------------------------------------- ---------------------------------- --------------------------------- ^ | |------------------------Switch TextView--------| | | Orientation Change | | | | | | -------------------------------------------- | ---------------------------------- --------------------------------- | UITextViewTextDidEndEditingNotification | <-------- | UIKeyboardWillHideNotification | | UIKeyboardDidHideNotification | -------------------------------------------- ---------------------------------- --------------------------------- | End Editing ^ | | |--------------------End Editing-------------------------------------------------------------| ---------------------------------------------------------------------------------------------------------------------------------------------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ---------------------------------------------------------------------------------------------------------------------------------------------- */ Pods/IQKeyboardManager/IQKeyBoardManager/Constants/IQKeyboardManagerConstantsInternal.h
New file @@ -0,0 +1,55 @@ // // IQKeyboardManagerConstantsInternal.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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. #ifndef IQKeyboardManagerConstantsInternal_h #define IQKeyboardManagerConstantsInternal_h ///----------------------------------- /// @name IQLayoutGuidePosition ///----------------------------------- /** `IQLayoutGuidePositionNone` If there are no IQLayoutGuideConstraint associated with viewController `IQLayoutGuidePositionTop` If provided IQLayoutGuideConstraint is associated with with viewController topLayoutGuide `IQLayoutGuidePositionBottom` If provided IQLayoutGuideConstraint is associated with with viewController bottomLayoutGuide */ typedef NS_ENUM(NSInteger, IQLayoutGuidePosition) { IQLayoutGuidePositionNone, IQLayoutGuidePositionTop, IQLayoutGuidePositionBottom, }; //Xcode 6 compatibility check #ifdef NSFoundationVersionNumber_iOS_7_1 #define IQ_IS_IOS8_OR_GREATER (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_7_1) #else #define IQ_IS_IOS8_OR_GREATER NO #endif #endif Pods/IQKeyboardManager/IQKeyBoardManager/IQKeyboardManager.h
New file @@ -0,0 +1,300 @@ // // IQKeyboardManager.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQKeyboardManagerConstants.h" #import <CoreGraphics/CGBase.h> #import <Foundation/NSObject.h> #import <Foundation/NSObjCRuntime.h> #import <UIKit/UITextInputTraits.h> #import <UIKit/UIView.h> @class UIFont; ///--------------------- /// @name IQToolbar tags ///--------------------- /** Default tag for toolbar with Done button -1002. */ extern NSInteger const kIQDoneButtonToolbarTag; /** Default tag for toolbar with Previous/Next buttons -1005. */ extern NSInteger const kIQPreviousNextButtonToolbarTag; /** Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. A generic version of KeyboardManagement. https://developer.apple.com/Library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html */ @interface IQKeyboardManager : NSObject ///-------------------------- /// @name UIKeyboard handling ///-------------------------- /** Returns the default singleton instance. */ + (nonnull instancetype)sharedManager; /** Enable/disable managing distance between keyboard and textField. Default is YES(Enabled when class loads in `+(void)load` method). */ @property(nonatomic, assign, getter = isEnabled) BOOL enable; /** To set keyboard distance from textField. can't be less than zero. Default is 10.0. */ @property(nonatomic, assign) CGFloat keyboardDistanceFromTextField; /** Prevent keyboard manager to slide up the rootView to more than keyboard height. Default is YES. */ @property(nonatomic, assign) BOOL preventShowingBottomBlankSpace; ///------------------------- /// @name IQToolbar handling ///------------------------- /** Automatic add IQToolbar functionality. Default is YES. */ @property(nonatomic, assign, getter = isEnableAutoToolbar) BOOL enableAutoToolbar; /** AutoToolbar managing behaviour. Default is IQAutoToolbarBySubviews. */ @property(nonatomic, assign) IQAutoToolbarManageBehaviour toolbarManageBehaviour; /** If YES, then uses textField's tintColor property for IQToolbar, otherwise tint color is black. Default is NO. */ @property(nonatomic, assign) BOOL shouldToolbarUsesTextFieldTintColor; /** This is used for toolbar.tintColor when textfield.keyboardAppearance is UIKeyboardAppearanceDefault. If shouldToolbarUsesTextFieldTintColor is YES then this property is ignored. Default is nil and uses black color. */ @property(nullable, nonatomic, strong) UIColor *toolbarTintColor; /** Toolbar done button icon, If nothing is provided then check toolbarDoneBarButtonItemText to draw done button. */ @property(nullable, nonatomic, strong) UIImage *toolbarDoneBarButtonItemImage; /** Toolbar done button text, If nothing is provided then system default 'UIBarButtonSystemItemDone' will be used. */ @property(nullable, nonatomic, strong) NSString *toolbarDoneBarButtonItemText; /** If YES, then it add the textField's placeholder text on IQToolbar. Default is YES. */ @property(nonatomic, assign) BOOL shouldShowTextFieldPlaceholder; /** Placeholder Font. Default is nil. */ @property(nullable, nonatomic, strong) UIFont *placeholderFont; ///-------------------------- /// @name UITextView handling ///-------------------------- /** Adjust textView's frame when it is too big in height. Default is NO. */ @property(nonatomic, assign) BOOL canAdjustTextView; /** Adjust textView's contentInset to fix a bug. for iOS 7.0.x - http://stackoverflow.com/questions/18966675/uitextview-in-ios7-clips-the-last-line-of-text-string Default is YES. */ @property(nonatomic, assign) BOOL shouldFixTextViewClip; ///--------------------------------------- /// @name UIKeyboard appearance overriding ///--------------------------------------- /** Override the keyboardAppearance for all textField/textView. Default is NO. */ @property(nonatomic, assign) BOOL overrideKeyboardAppearance; /** If overrideKeyboardAppearance is YES, then all the textField keyboardAppearance is set using this property. */ @property(nonatomic, assign) UIKeyboardAppearance keyboardAppearance; ///--------------------------------------------- /// @name UITextField/UITextView Next/Previous/Resign handling ///--------------------------------------------- /** Resigns Keyboard on touching outside of UITextField/View. Default is NO. */ @property(nonatomic, assign) BOOL shouldResignOnTouchOutside; /** Resigns currently first responder field. */ - (BOOL)resignFirstResponder; /** Returns YES if can navigate to previous responder textField/textView, otherwise NO. */ @property (nonatomic, readonly) BOOL canGoPrevious; /** Returns YES if can navigate to next responder textField/textView, otherwise NO. */ @property (nonatomic, readonly) BOOL canGoNext; /** Navigate to previous responder textField/textView. */ - (BOOL)goPrevious; /** Navigate to next responder textField/textView. */ - (BOOL)goNext; ///---------------------------- /// @name UIScrollView handling ///---------------------------- /** Restore scrollViewContentOffset when resigning from scrollView. Default is NO. */ @property(nonatomic, assign) BOOL shouldRestoreScrollViewContentOffset __attribute__ ((deprecated("Please use IQUIScrollView+Additions category instead. This property will be removed from here in future release."))); ///------------------------------------------------ /// @name UISound handling ///------------------------------------------------ /** If YES, then it plays inputClick sound on next/previous/done click. */ @property(nonatomic, assign) BOOL shouldPlayInputClicks; ///--------------------------- /// @name UIAnimation handling ///--------------------------- /** If YES, then uses keyboard default animation curve style to move view, otherwise uses UIViewAnimationOptionCurveEaseInOut animation style. Default is YES. @warning Sometimes strange animations may be produced if uses default curve style animation in iOS 7 and changing the textFields very frequently. */ @property(nonatomic, assign) BOOL shouldAdoptDefaultKeyboardAnimation; /** If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view. */ @property(nonatomic, assign) BOOL layoutIfNeededOnUpdate; ///------------------------------------ /// @name Class Level disabling methods ///------------------------------------ /** Disable adjusting view in disabledClass @param disabledClass Class in which library should not adjust view to show textField. */ -(void)disableInViewControllerClass:(nonnull Class)disabledClass __attribute__ ((deprecated("This method is replaced with disableDistanceHandlingInViewControllerClass: method to adopt more graceful method name. Some developers confuses with this method name. This method will be removed in upcoming release."))); -(void)disableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass; /** Re-enable adjusting textField in disabledClass @param disabledClass Class in which library should re-enable adjust view to show textField. */ -(void)removeDisableInViewControllerClass:(nonnull Class)disabledClass __attribute__ ((deprecated("This method is replaced with removeDisableDistanceHandlingInViewControllerClass: method to adopt more graceful method name. Some developers confuses with this method name. This method will be removed in upcoming release."))); -(void)removeDisableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass; /** Returns All disabled classes registered with disableInViewControllerClass. */ -( NSSet* _Nonnull )disabledInViewControllerClasses; /** Disable automatic toolbar creation in in toolbarDisabledClass @param toolbarDisabledClass Class in which library should not add toolbar over textField. */ -(void)disableToolbarInViewControllerClass:(nonnull Class)toolbarDisabledClass; /** Re-enable automatic toolbar creation in in toolbarDisabledClass @param toolbarDisabledClass Class in which library should re-enable automatic toolbar creation over textField. */ -(void)removeDisableToolbarInViewControllerClass:(nonnull Class)toolbarDisabledClass; /** Returns All toolbar disabled classes registered with disableToolbarInViewControllerClass. */ -( NSSet* _Nonnull )disabledToolbarInViewControllerClasses; /** Consider provided customView class as superView of all inner textField for calculating next/previous button logic. @param toolbarPreviousNextConsideredClass Custom UIView subclass Class in which library should consider all inner textField as siblings and add next/previous accordingly. */ -(void)considerToolbarPreviousNextInViewClass:(nonnull Class)toolbarPreviousNextConsideredClass; /** Remove Consideration for provided customView class as superView of all inner textField for calculating next/previous button logic. @param toolbarPreviousNextConsideredClass Custom UIView subclass Class in which library should remove consideration for all inner textField as superView. */ -(void)removeConsiderToolbarPreviousNextInViewClass:(nonnull Class)toolbarPreviousNextConsideredClass; /** Returns All toolbar considered classes registered with considerToolbarPreviousNextInViewClass. */ -(NSSet* _Nonnull)consideredToolbarPreviousNextViewClasses; ///---------------------------------------- /// @name Must not be used for subclassing. ///---------------------------------------- /** Unavailable. Please use sharedManager method */ -(nonnull instancetype)init NS_UNAVAILABLE; /** Unavailable. Please use sharedManager method */ + (nonnull instancetype)new NS_UNAVAILABLE; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQKeyboardManager.m
New file @@ -0,0 +1,1935 @@ // // IQKeyboardManager.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQKeyboardManager.h" #import "IQUIView+Hierarchy.h" #import "IQUIView+IQKeyboardToolbar.h" #import "IQUIWindow+Hierarchy.h" #import "IQNSArray+Sort.h" #import "IQToolbar.h" #import "IQBarButtonItem.h" #import "IQKeyboardManagerConstantsInternal.h" #import "IQUIScrollView+Additions.h" #import "IQUITextFieldView+Additions.h" #import "IQUIViewController+Additions.h" #import <UIKit/UINavigationBar.h> #import <UIKit/UITapGestureRecognizer.h> #import <UIKit/UITextField.h> #import <UIKit/UITextView.h> #import <UIKit/UITableViewController.h> #import <UIKit/UINavigationController.h> #import <UIKit/UITableView.h> #import <UIKit/UITouch.h> #import <UIKit/UICollectionView.h> #import <UIKit/NSLayoutConstraint.h> NSInteger const kIQDoneButtonToolbarTag = -1002; NSInteger const kIQPreviousNextButtonToolbarTag = -1005; void _IQShowLog(NSString *logString); @interface IQKeyboardManager()<UIGestureRecognizerDelegate> // Private helper methods - (void)adjustFrame; // Private function to manipulate RootViewController's frame with animation. - (void)setRootViewFrame:(CGRect)frame; // Keyboard Notification methods - (void)keyboardWillShow:(NSNotification*)aNotification; - (void)keyboardWillHide:(NSNotification*)aNotification; - (void)keyboardDidHide:(NSNotification*)aNotification; // UITextField/UITextView Notification methods - (void)textFieldViewDidBeginEditing:(NSNotification*)notification; - (void)textFieldViewDidEndEditing:(NSNotification*)notification; - (void)textFieldViewDidChange:(NSNotification*)notification; // Rotation notification - (void)willChangeStatusBarOrientation:(NSNotification*)aNotification; // Tap Recognizer - (void)tapRecognized:(UITapGestureRecognizer*)gesture; // Next/Previous/Done methods - (void)previousAction:(IQBarButtonItem*)barButton; - (void)nextAction:(IQBarButtonItem*)barButton; - (void)doneAction:(IQBarButtonItem*)barButton; // Adding Removing IQToolbar methods - (NSArray*)responderViews; - (void)addToolbarIfRequired; - (void)removeToolbarIfRequired; @end @implementation IQKeyboardManager { @package /*******************************************/ /** To save UITextField/UITextView object voa textField/textView notifications. */ __weak UIView *_textFieldView; /** used with canAdjustTextView boolean. */ __block CGRect _textFieldViewIntialFrame; /** To save rootViewController.view.frame. */ CGRect _topViewBeginRect; /** To save rootViewController */ __weak UIViewController *_rootViewController; /** To save topBottomLayoutConstraint original constant */ CGFloat _layoutGuideConstraintInitialConstant; /*******************************************/ /** Variable to save lastScrollView that was scrolled. */ __weak UIScrollView *_lastScrollView; /** LastScrollView's initial contentInsets. */ UIEdgeInsets _startingContentInsets; /** LastScrollView's initial scrollIndicatorInsets. */ UIEdgeInsets _startingScrollIndicatorInsets; /** LastScrollView's initial contentOffset. */ CGPoint _startingContentOffset; /*******************************************/ /** To save keyboardWillShowNotification. Needed for enable keyboard functionality. */ NSNotification *_kbShowNotification; /** To save keyboard size. */ CGSize _kbSize; /** To save keyboard animation duration. */ CGFloat _animationDuration; /** To mimic the keyboard animation */ NSInteger _animationCurve; /*******************************************/ /** TapGesture to resign keyboard on view's touch. */ UITapGestureRecognizer *_tapGesture; /*******************************************/ /** Set of restricted classes for library */ NSMutableSet *_disabledClasses; /** Set of restricted classes for adding toolbar */ NSMutableSet *_disabledToolbarClasses; /** Set of permitted classes to add all inner textField as siblings */ NSMutableSet *_toolbarPreviousNextConsideredClass; /*******************************************/ struct { /** used with canAdjustTextView to detect a textFieldView frame is changes or not. (Bug ID: #92)*/ unsigned int isTextFieldViewFrameChanged:1; /** Boolean to maintain keyboard is showing or it is hide. To solve rootViewController.view.frame calculations. */ unsigned int isKeyboardShowing:1; } _keyboardManagerFlags; } //UIKeyboard handling @synthesize enable = _enable; @synthesize keyboardDistanceFromTextField = _keyboardDistanceFromTextField; @synthesize preventShowingBottomBlankSpace = _preventShowingBottomBlankSpace; //Keyboard Appearance handling @synthesize overrideKeyboardAppearance = _overrideKeyboardAppearance; @synthesize keyboardAppearance = _keyboardAppearance; //IQToolbar handling @synthesize enableAutoToolbar = _enableAutoToolbar; @synthesize toolbarManageBehaviour = _toolbarManageBehaviour; @synthesize shouldToolbarUsesTextFieldTintColor = _shouldToolbarUsesTextFieldTintColor; @synthesize toolbarTintColor = _toolbarTintColor; @synthesize shouldShowTextFieldPlaceholder = _shouldShowTextFieldPlaceholder; @synthesize placeholderFont = _placeholderFont; //TextView handling @synthesize canAdjustTextView = _canAdjustTextView; @synthesize shouldFixTextViewClip = _shouldFixTextViewClip; //Resign handling @synthesize shouldResignOnTouchOutside = _shouldResignOnTouchOutside; //Sound handling @synthesize shouldPlayInputClicks = _shouldPlayInputClicks; //Animation handling @synthesize shouldAdoptDefaultKeyboardAnimation = _shouldAdoptDefaultKeyboardAnimation; @synthesize layoutIfNeededOnUpdate = _layoutIfNeededOnUpdate; //ScrollView handling @synthesize shouldRestoreScrollViewContentOffset= _shouldRestoreScrollViewContentOffset; #pragma mark - Initializing functions /** 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]; } /* Singleton Object Initialization. */ -(instancetype)init { if (self = [super init]) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ // Registering for keyboard notification. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification 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 textField notification. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidBeginEditing:) name:UITextFieldTextDidBeginEditingNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidEndEditing:) name:UITextFieldTextDidEndEditingNotification object:nil]; // Registering for textView notification. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidEndEditing:) name:UITextViewTextDidEndEditingNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldViewDidChange:) name:UITextViewTextDidChangeNotification object:nil]; // Registering for orientation changes notification [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willChangeStatusBarOrientation:) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil]; //Creating gesture for @shouldResignOnTouchOutside. (Enhancement ID: #14) _tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapRecognized:)]; _tapGesture.cancelsTouchesInView = NO; [_tapGesture setDelegate:self]; _tapGesture.enabled = _shouldResignOnTouchOutside; //Setting it's initial values _enable = NO; //This enables in +(void)load method. _animationDuration = 0.25; _animationCurve = UIViewAnimationCurveEaseInOut; [self setKeyboardDistanceFromTextField:10.0]; [self setCanAdjustTextView:NO]; [self setShouldPlayInputClicks:NO]; [self setShouldResignOnTouchOutside:NO]; [self setOverrideKeyboardAppearance:NO]; [self setKeyboardAppearance:UIKeyboardAppearanceDefault]; [self setEnableAutoToolbar:YES]; [self setPreventShowingBottomBlankSpace:YES]; [self setShouldShowTextFieldPlaceholder:YES]; [self setShouldAdoptDefaultKeyboardAnimation:YES]; [self setShouldRestoreScrollViewContentOffset:NO]; [self setToolbarManageBehaviour:IQAutoToolbarBySubviews]; [self setLayoutIfNeededOnUpdate:NO]; //Initializing disabled classes Set. _disabledClasses = [[NSMutableSet alloc] initWithObjects:[UITableViewController class], nil]; _disabledToolbarClasses = [[NSMutableSet alloc] init]; [self setShouldToolbarUsesTextFieldTintColor:NO]; [self setShouldFixTextViewClip:YES]; _toolbarPreviousNextConsideredClass = [[NSMutableSet alloc] initWithObjects:[UITableView class],[UICollectionView class], nil]; }); } return self; } /* Automatically called from the `+(void)load` method. */ + (instancetype)sharedManager { //Singleton instance static IQKeyboardManager *kbManager; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ kbManager = [[self alloc] init]; }); return kbManager; } #pragma mark - Dealloc -(void)dealloc { // Disable the keyboard manager. [self setEnable:NO]; //Removing notification observers on dealloc. [[NSNotificationCenter defaultCenter] removeObserver:self]; } #pragma mark - Property functions -(void)setEnable:(BOOL)enable { // If not enabled, enable it. if (enable == YES && _enable == NO) { //Setting NO to _enable. _enable = enable; //If keyboard is currently showing. Sending a fake notification for keyboardWillShow to adjust view according to keyboard. if (_kbShowNotification) [self keyboardWillShow:_kbShowNotification]; _IQShowLog(IQLocalizedString(@"enabled", nil)); } //If not disable, desable it. else if (enable == NO && _enable == YES) { //Sending a fake notification for keyboardWillHide to retain view's original frame. [self keyboardWillHide:nil]; //Setting NO to _enable. _enable = enable; _IQShowLog(IQLocalizedString(@"disabled", nil)); } //If already disabled. else if (enable == NO && _enable == NO) { _IQShowLog(IQLocalizedString(@"already disabled", nil)); } //If already enabled. else if (enable == YES && _enable == YES) { _IQShowLog(IQLocalizedString(@"already enabled", nil)); } } // Setting keyboard distance from text field. -(void)setKeyboardDistanceFromTextField:(CGFloat)keyboardDistanceFromTextField { //Can't be less than zero. Minimum is zero. _keyboardDistanceFromTextField = MAX(keyboardDistanceFromTextField, 0); _IQShowLog([NSString stringWithFormat:@"keyboardDistanceFromTextField: %.2f",_keyboardDistanceFromTextField]); } /** Enabling/disable gesture on touching. */ -(void)setShouldResignOnTouchOutside:(BOOL)shouldResignOnTouchOutside { _IQShowLog([NSString stringWithFormat:@"shouldResignOnTouchOutside: %@",shouldResignOnTouchOutside?@"Yes":@"No"]); _shouldResignOnTouchOutside = shouldResignOnTouchOutside; //Enable/Disable gesture recognizer (Enhancement ID: #14) [_tapGesture setEnabled:_shouldResignOnTouchOutside]; } /** Enable/disable autotoolbar. Adding and removing toolbar if required. */ -(void)setEnableAutoToolbar:(BOOL)enableAutoToolbar { _enableAutoToolbar = enableAutoToolbar; _IQShowLog([NSString stringWithFormat:@"enableAutoToolbar: %@",enableAutoToolbar?@"Yes":@"No"]); //If enabled then adding toolbar. if (_enableAutoToolbar == YES) { [self addToolbarIfRequired]; } //Else removing toolbar. else { [self removeToolbarIfRequired]; } } #pragma mark - Private Methods /** Getting keyWindow. */ -(UIWindow *)keyWindow { if (_textFieldView.window) { return _textFieldView.window; } else { static UIWindow *_keyWindow = nil; /* (Bug ID: #23, #25, #73) */ 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; return _keyWindow; } } /* Helper function to manipulate RootViewController's frame with animation. */ -(void)setRootViewFrame:(CGRect)frame { // Getting topMost ViewController. UIViewController *controller = [_textFieldView topMostController]; if (controller == nil) controller = [[self keyWindow] topMostController]; //frame size needs to be adjusted on iOS8 due to orientation API changes. if (IQ_IS_IOS8_OR_GREATER) { frame.size = controller.view.frame.size; } // If can't get rootViewController then printing warning to user. if (controller == nil) _IQShowLog(IQLocalizedString(@"You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager", nil)); //Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations. [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ // Setting it's new frame [controller.view setFrame:frame]; //Animating content if needed (Bug ID: #204) if (_layoutIfNeededOnUpdate) { //Animating content (Bug ID: #160) [controller.view setNeedsLayout]; [controller.view layoutIfNeeded]; } _IQShowLog([NSString stringWithFormat:@"Set %@ frame to : %@",[controller _IQDescription],NSStringFromCGRect(frame)]); } completion:NULL]; } /* Adjusting RootViewController's frame according to interface orientation. */ -(void)adjustFrame { // We are unable to get textField object while keyboard showing on UIWebView's textField. (Bug ID: #11) if (_textFieldView == nil) return; _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); // Boolean to know keyboard is showing/hiding _keyboardManagerFlags.isKeyboardShowing = YES; // Getting KeyWindow object. UIWindow *keyWindow = [self keyWindow]; // Getting RootViewController. (Bug ID: #1, #4) UIViewController *rootController = [_textFieldView topMostController]; if (rootController == nil) rootController = [keyWindow topMostController]; //If it's iOS8 then we should do calculations according to portrait orientations. // (Bug ID: #64, #66) #ifdef __IPHONE_8_0 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 UIInterfaceOrientation interfaceOrientation = UIInterfaceOrientationPortrait; #else UIInterfaceOrientation interfaceOrientation = IQ_IS_IOS8_OR_GREATER ? UIInterfaceOrientationPortrait : [rootController interfaceOrientation]; #endif #else UIInterfaceOrientation interfaceOrientation = [rootController interfaceOrientation]; #endif // Converting Rectangle according to window bounds. CGRect textFieldViewRect = [[_textFieldView superview] convertRect:_textFieldView.frame toView:keyWindow]; // Getting RootViewRect. CGRect rootViewRect = [[rootController view] frame]; //Getting statusBarFrame CGFloat topLayoutGuide = 0; //Maintain keyboardDistanceFromTextField CGFloat keyboardDistanceFromTextField = (_textFieldView.keyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance)?_keyboardDistanceFromTextField:_textFieldView.keyboardDistanceFromTextField; CGSize kbSize = _kbSize; CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; // (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])) { layoutGuidePosition = IQLayoutGuidePositionTop; } //If bottomLayoutGuice constraint else if (constraint && (constraint.firstItem == [[_textFieldView viewController] bottomLayoutGuide] || constraint.secondItem == [[_textFieldView viewController] bottomLayoutGuide])) { layoutGuidePosition = IQLayoutGuidePositionBottom; } switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: topLayoutGuide = CGRectGetWidth(statusBarFrame); kbSize.width += keyboardDistanceFromTextField; break; case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: topLayoutGuide = CGRectGetHeight(statusBarFrame); kbSize.height += keyboardDistanceFromTextField; break; default: break; } CGFloat move = 0; // +Move positive = textField is hidden. // -Move negative = textField is showing. // Checking if there is bottomLayoutGuide attached (Bug ID: #250) if (layoutGuidePosition == IQLayoutGuidePositionBottom) { // Calculating move position. switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: move = CGRectGetMaxX(textFieldViewRect)-(CGRectGetWidth(keyWindow.frame)-kbSize.width); break; case UIInterfaceOrientationLandscapeRight: move = kbSize.width-CGRectGetMinX(textFieldViewRect); break; case UIInterfaceOrientationPortrait: move = CGRectGetMaxY(textFieldViewRect)-(CGRectGetHeight(keyWindow.frame)-kbSize.height); break; case UIInterfaceOrientationPortraitUpsideDown: move = kbSize.height-CGRectGetMinY(textFieldViewRect); break; default: break; } } else { // Calculating move position. Common for both normal and special cases. switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: move = MIN(CGRectGetMinX(textFieldViewRect)-(topLayoutGuide+5), CGRectGetMaxX(textFieldViewRect)-(CGRectGetWidth(keyWindow.frame)-kbSize.width)); break; case UIInterfaceOrientationLandscapeRight: move = MIN(CGRectGetWidth(keyWindow.frame)-CGRectGetMaxX(textFieldViewRect)-(topLayoutGuide+5), kbSize.width-CGRectGetMinX(textFieldViewRect)); break; case UIInterfaceOrientationPortrait: move = MIN(CGRectGetMinY(textFieldViewRect)-(topLayoutGuide+5), CGRectGetMaxY(textFieldViewRect)-(CGRectGetHeight(keyWindow.frame)-kbSize.height)); break; case UIInterfaceOrientationPortraitUpsideDown: move = MIN(CGRectGetHeight(keyWindow.frame)-CGRectGetMaxY(textFieldViewRect)-(topLayoutGuide+5), kbSize.height-CGRectGetMinY(textFieldViewRect)); break; default: break; } } _IQShowLog([NSString stringWithFormat:@"Need to move: %.2f",move]); // Getting it's superScrollView. // (Enhancement ID: #21, #24) UIScrollView *superScrollView = (UIScrollView*)[_textFieldView superviewOfClassType:[UIScrollView class]]; //If there was a lastScrollView. // (Bug ID: #34) if (_lastScrollView) { //If we can't find current superScrollView, then setting lastScrollView to it's original form. if (superScrollView == nil) { _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ [_lastScrollView setContentInset:_startingContentInsets]; _lastScrollView.scrollIndicatorInsets = _startingScrollIndicatorInsets; } completion:NULL]; if (_lastScrollView.shouldRestoreScrollViewContentOffset) { [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; } _startingContentInsets = UIEdgeInsetsZero; _startingScrollIndicatorInsets = UIEdgeInsetsZero; _startingContentOffset = CGPointZero; _lastScrollView = nil; } //If both scrollView's are different, then reset lastScrollView to it's original frame and setting current scrollView as last scrollView. else if (superScrollView != _lastScrollView) { _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ [_lastScrollView setContentInset:_startingContentInsets]; _lastScrollView.scrollIndicatorInsets = _startingScrollIndicatorInsets; } completion:NULL]; if (_lastScrollView.shouldRestoreScrollViewContentOffset) { [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; } _lastScrollView = superScrollView; _startingContentInsets = superScrollView.contentInset; _startingScrollIndicatorInsets = superScrollView.scrollIndicatorInsets; _startingContentOffset = superScrollView.contentOffset; _IQShowLog([NSString stringWithFormat:@"Saving New %@ contentInset: %@ and contentOffset : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); } //Else the case where superScrollView == lastScrollView means we are on same scrollView after switching to different textField. So doing nothing } //If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView. else if(superScrollView) { _lastScrollView = superScrollView; _startingContentInsets = superScrollView.contentInset; _startingContentOffset = superScrollView.contentOffset; _startingScrollIndicatorInsets = superScrollView.scrollIndicatorInsets; _IQShowLog([NSString stringWithFormat:@"Saving %@ contentInset: %@ and contentOffset : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); } // Special case for ScrollView. { // If we found lastScrollView then setting it's contentOffset to show textField. if (_lastScrollView) { //Saving UIView *lastView = _textFieldView; 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) ) { //Getting lastViewRect. CGRect lastViewRect = [[lastView superview] convertRect:lastView.frame toView:superScrollView]; //Calculating the expected Y offset from move and scrollView's contentOffset. CGFloat shouldOffsetY = superScrollView.contentOffset.y - MIN(superScrollView.contentOffset.y,-move); //Rearranging the expected Y offset according to the view. shouldOffsetY = MIN(shouldOffsetY, lastViewRect.origin.y/*-5*/); //-5 is for good UI.//Commenting -5 (Bug ID: #69) //[_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)) { CGFloat maintainTopLayout = 0; //When uncommenting this, each calculation goes to well, but don't know why scrollView doesn't adjusting it's contentOffset at bottom // if ([_textFieldView.viewController respondsToSelector:@selector(topLayoutGuide)]) // maintainTopLayout = [_textFieldView.viewController.topLayoutGuide length]; // else maintainTopLayout = CGRectGetMaxY(_textFieldView.viewController.navigationController.navigationBar.frame); maintainTopLayout+= 10; //For good UI // Converting Rectangle according to window bounds. CGRect currentTextFieldViewRect = [[_textFieldView superview] convertRect:_textFieldView.frame toView:keyWindow]; CGFloat expectedFixDistance = shouldOffsetY; //Calculating expected fix distance which needs to be managed from navigation bar switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: expectedFixDistance = CGRectGetMinX(currentTextFieldViewRect) - maintainTopLayout; break; case UIInterfaceOrientationLandscapeRight: expectedFixDistance = (CGRectGetWidth(keyWindow.frame)-CGRectGetMaxX(currentTextFieldViewRect)) - maintainTopLayout; break; case UIInterfaceOrientationPortrait: expectedFixDistance = CGRectGetMinY(currentTextFieldViewRect) - maintainTopLayout; break; case UIInterfaceOrientationPortraitUpsideDown: expectedFixDistance = (CGRectGetHeight(keyWindow.frame)-CGRectGetMaxY(currentTextFieldViewRect)) - maintainTopLayout; break; default: break; } //Now if expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance) is lower than current shouldOffsetY, which means we're in a position where navigationBar up and hide, then reducing shouldOffsetY with expectedOffsetY (superScrollView.contentOffset.y + expectedFixDistance) shouldOffsetY = MIN(shouldOffsetY, superScrollView.contentOffset.y + expectedFixDistance); //Setting move to 0 because now we don't want to move any view anymore (All will be managed by our contentInset logic. move = 0; } else { //Subtracting the Y offset from the move variable, because we are going to change scrollView's contentOffset.y to shouldOffsetY. move -= (shouldOffsetY-superScrollView.contentOffset.y); } //Getting problem while using `setContentOffset:animated:`, So I used animation API. [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _IQShowLog([NSString stringWithFormat:@"Adjusting %.2f to %@ ContentOffset",(superScrollView.contentOffset.y-shouldOffsetY),[superScrollView _IQDescription]]); _IQShowLog([NSString stringWithFormat:@"Remaining Move: %.2f",move]); superScrollView.contentOffset = CGPointMake(superScrollView.contentOffset.x, shouldOffsetY); } completion:NULL]; // Getting next lastView & superScrollView. lastView = superScrollView; superScrollView = (UIScrollView*)[lastView superviewOfClassType:[UIScrollView class]]; } //Updating contentInset { CGFloat bottom = 0; CGRect lastScrollViewRect = [[_lastScrollView superview] convertRect:_lastScrollView.frame toView:keyWindow]; switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: bottom = kbSize.width-(CGRectGetWidth(keyWindow.frame)-CGRectGetMaxX(lastScrollViewRect)); break; case UIInterfaceOrientationLandscapeRight: bottom = kbSize.width-CGRectGetMinX(lastScrollViewRect); break; case UIInterfaceOrientationPortrait: bottom = kbSize.height-(CGRectGetHeight(keyWindow.frame)-CGRectGetMaxY(lastScrollViewRect)); break; case UIInterfaceOrientationPortraitUpsideDown: bottom = kbSize.height-CGRectGetMinY(lastScrollViewRect); break; default: break; } // Update the insets so that the scroll vew doesn't shift incorrectly when the offset is near the bottom of the scroll view. UIEdgeInsets movedInsets = _lastScrollView.contentInset; movedInsets.bottom = MAX(_startingContentInsets.bottom, bottom); _IQShowLog([NSString stringWithFormat:@"%@ old ContentInset : %@",[_lastScrollView _IQDescription], NSStringFromUIEdgeInsets(_lastScrollView.contentInset)]); [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _lastScrollView.contentInset = movedInsets; UIEdgeInsets newInset = _lastScrollView.scrollIndicatorInsets; newInset.bottom = movedInsets.bottom - 10; _lastScrollView.scrollIndicatorInsets = newInset; } completion:NULL]; //Maintaining contentSize if (_lastScrollView.contentSize.height<_lastScrollView.frame.size.height) { CGSize contentSize = _lastScrollView.contentSize; contentSize.height = _lastScrollView.frame.size.height; _lastScrollView.contentSize = contentSize; } _IQShowLog([NSString stringWithFormat:@"%@ new ContentInset : %@",[_lastScrollView _IQDescription], NSStringFromUIEdgeInsets(_lastScrollView.contentInset)]); } } //Going ahead. No else if. } if (layoutGuidePosition == IQLayoutGuidePositionTop) { CGFloat constant = MIN(_layoutGuideConstraintInitialConstant, constraint.constant-move); [UIView animateWithDuration:_animationDuration delay:0 options:(7<<16|UIViewAnimationOptionBeginFromCurrentState) animations:^{ constraint.constant = constant; [_rootViewController.view setNeedsLayout]; [_rootViewController.view layoutIfNeeded]; } completion:^(BOOL finished) { }]; } //If bottomLayoutGuice constraint else if (layoutGuidePosition == IQLayoutGuidePositionBottom) { CGFloat constant = MAX(_layoutGuideConstraintInitialConstant, constraint.constant+move); [UIView animateWithDuration:_animationDuration delay:0 options:(7<<16|UIViewAnimationOptionBeginFromCurrentState) animations:^{ constraint.constant = constant; [_rootViewController.view setNeedsLayout]; [_rootViewController.view layoutIfNeeded]; } completion:^(BOOL finished) { }]; } //If not constraint else { //Special case for UITextView(Readjusting the move variable when textView hight is too big to fit on screen) //_canAdjustTextView If we have permission to adjust the textView, then let's do it on behalf of user (Enhancement ID: #15) //_lastScrollView If not having inside any scrollView, (now contentInset manages the full screen textView. //[_textFieldView isKindOfClass:[UITextView class]] If is a UITextView type //_isTextFieldViewFrameChanged If frame is not change by library in past (Bug ID: #92) if (_canAdjustTextView && (_lastScrollView == nil) && [_textFieldView isKindOfClass:[UITextView class]] && _keyboardManagerFlags.isTextFieldViewFrameChanged == NO) { CGFloat textViewHeight = CGRectGetHeight(_textFieldView.frame); switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: textViewHeight = MIN(textViewHeight, (CGRectGetWidth(keyWindow.frame)-kbSize.width-(topLayoutGuide+5))); break; case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: textViewHeight = MIN(textViewHeight, (CGRectGetHeight(keyWindow.frame)-kbSize.height-(topLayoutGuide+5))); break; default: break; } [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _IQShowLog([NSString stringWithFormat:@"%@ Old Frame : %@",[_textFieldView _IQDescription], NSStringFromCGRect(_textFieldView.frame)]); CGRect textFieldViewRect = _textFieldView.frame; textFieldViewRect.size.height = textViewHeight; _textFieldView.frame = textFieldViewRect; _keyboardManagerFlags.isTextFieldViewFrameChanged = YES; _IQShowLog([NSString stringWithFormat:@"%@ New Frame : %@",[_textFieldView _IQDescription], NSStringFromCGRect(_textFieldView.frame)]); } completion:NULL]; } // Special case for iPad modalPresentationStyle. if ([rootController modalPresentationStyle] == UIModalPresentationFormSheet || [rootController modalPresentationStyle] == UIModalPresentationPageSheet) { _IQShowLog([NSString stringWithFormat:@"Found Special case for Model Presentation Style: %ld",(long)(rootController.modalPresentationStyle)]); // +Positive or zero. if (move>=0) { // We should only manipulate y. rootViewRect.origin.y -= move; // From now prevent keyboard manager to slide up the rootView to more than keyboard height. (Bug ID: #93) if (_preventShowingBottomBlankSpace == YES) { CGFloat minimumY = 0; switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: case UIInterfaceOrientationLandscapeRight: minimumY = CGRectGetWidth(keyWindow.frame)-rootViewRect.size.height-topLayoutGuide-(kbSize.width-keyboardDistanceFromTextField); break; case UIInterfaceOrientationPortrait: case UIInterfaceOrientationPortraitUpsideDown: minimumY = (CGRectGetHeight(keyWindow.frame)-rootViewRect.size.height-topLayoutGuide)/2-(kbSize.height-keyboardDistanceFromTextField); break; default: break; } rootViewRect.origin.y = MAX(rootViewRect.origin.y, minimumY); } _IQShowLog(@"Moving Upward"); // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; } // -Negative else { // Calculating disturbed distance. Pull Request #3 CGFloat disturbDistance = CGRectGetMinY(rootViewRect)-CGRectGetMinY(_topViewBeginRect); // disturbDistance Negative = frame disturbed. // disturbDistance positive = frame not disturbed. if(disturbDistance<0) { // We should only manipulate y. rootViewRect.origin.y -= MAX(move, disturbDistance); _IQShowLog(@"Moving Downward"); // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; } } } //If presentation style is neither UIModalPresentationFormSheet nor UIModalPresentationPageSheet then going ahead.(General case) else { // +Positive or zero. if (move>=0) { switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: rootViewRect.origin.x -= move; break; case UIInterfaceOrientationLandscapeRight: rootViewRect.origin.x += move; break; case UIInterfaceOrientationPortrait: rootViewRect.origin.y -= move; break; case UIInterfaceOrientationPortraitUpsideDown: rootViewRect.origin.y += move; break; default: break; } // From now prevent keyboard manager to slide up the rootView to more than keyboard height. (Bug ID: #93) if (_preventShowingBottomBlankSpace == YES) { switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: rootViewRect.origin.x = MAX(rootViewRect.origin.x, MIN(0,-kbSize.width+keyboardDistanceFromTextField)); break; case UIInterfaceOrientationLandscapeRight: rootViewRect.origin.x = MIN(rootViewRect.origin.x, +kbSize.width-keyboardDistanceFromTextField); break; case UIInterfaceOrientationPortrait: rootViewRect.origin.y = MAX(rootViewRect.origin.y, MIN(0, -kbSize.height+keyboardDistanceFromTextField)); break; case UIInterfaceOrientationPortraitUpsideDown: rootViewRect.origin.y = MIN(rootViewRect.origin.y, +kbSize.height-keyboardDistanceFromTextField); break; default: break; } } _IQShowLog(@"Moving Upward"); // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; } // -Negative else { CGFloat disturbDistance = 0; switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: disturbDistance = CGRectGetMinX(rootViewRect)-CGRectGetMinX(_topViewBeginRect); break; case UIInterfaceOrientationLandscapeRight: disturbDistance = CGRectGetMinX(_topViewBeginRect)-CGRectGetMinX(rootViewRect); break; case UIInterfaceOrientationPortrait: disturbDistance = CGRectGetMinY(rootViewRect)-CGRectGetMinY(_topViewBeginRect); break; case UIInterfaceOrientationPortraitUpsideDown: disturbDistance = CGRectGetMinY(_topViewBeginRect)-CGRectGetMinY(rootViewRect); break; default: break; } // disturbDistance Negative = frame disturbed. Pull Request #3 // disturbDistance positive = frame not disturbed. if(disturbDistance<0) { switch (interfaceOrientation) { case UIInterfaceOrientationLandscapeLeft: rootViewRect.origin.x -= MAX(move, disturbDistance); break; case UIInterfaceOrientationLandscapeRight: rootViewRect.origin.x += MAX(move, disturbDistance); break; case UIInterfaceOrientationPortrait: rootViewRect.origin.y -= MAX(move, disturbDistance); break; case UIInterfaceOrientationPortraitUpsideDown: rootViewRect.origin.y += MAX(move, disturbDistance); break; default: break; } _IQShowLog(@"Moving Downward"); // Setting adjusted rootViewRect [self setRootViewFrame:rootViewRect]; } } } } _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } #pragma mark - UIKeyboad Notification methods /* UIKeyboardWillShowNotification. */ -(void)keyboardWillShow:(NSNotification*)aNotification { _kbShowNotification = aNotification; if (_enable == NO) return; _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); //Due to orientation callback we need to resave it's original frame. // (Bug ID: #46) //Added _isTextFieldViewFrameChanged check. Saving textFieldView current frame to use it with canAdjustTextView if textViewFrame has already not been changed. (Bug ID: #92) if (_keyboardManagerFlags.isTextFieldViewFrameChanged == NO && _textFieldView) { _textFieldViewIntialFrame = _textFieldView.frame; _IQShowLog([NSString stringWithFormat:@"Saving %@ Initial frame :%@",[_textFieldView _IQDescription],NSStringFromCGRect(_textFieldViewIntialFrame)]); } 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; _IQShowLog([NSString stringWithFormat:@"Saving %@ beginning Frame: %@",[_rootViewController _IQDescription] ,NSStringFromCGRect(_topViewBeginRect)]); } if (_shouldAdoptDefaultKeyboardAnimation) { // Getting keyboard animation. _animationCurve = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; _animationCurve = _animationCurve<<16; } else { _animationCurve = UIViewAnimationOptionCurveEaseOut; } // Getting keyboard animation duration CGFloat duration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; //Saving animation duration if (duration != 0.0) _animationDuration = duration; CGSize oldKBSize = _kbSize; // Getting UIKeyboardSize. CGRect kbFrame = [[[aNotification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue]; _kbSize = kbFrame.size; _IQShowLog([NSString stringWithFormat:@"UIKeyboard Size : %@",NSStringFromCGSize(_kbSize)]); //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) { UIViewController *textFieldViewController = [_textFieldView viewController]; BOOL shouldIgnore = NO; for (Class disabledClass in _disabledClasses) { if ([textFieldViewController isKindOfClass:disabledClass]) { shouldIgnore = YES; break; } } if (shouldIgnore == NO) { [self adjustFrame]; } } } _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } /* UIKeyboardWillHideNotification. So setting rootViewController to it's default frame. */ - (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 (_enable == NO) return; _IQShowLog([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 _keyboardManagerFlags.isKeyboardShowing = NO; // Getting keyboard animation duration CGFloat aDuration = [[[aNotification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]; if (aDuration!= 0.0f) { _animationDuration = aDuration; } //Restoring the contentOffset of the lastScrollView if (_lastScrollView) { [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _lastScrollView.contentInset = _startingContentInsets; _lastScrollView.scrollIndicatorInsets = _startingScrollIndicatorInsets; if (_lastScrollView.shouldRestoreScrollViewContentOffset) { _lastScrollView.contentOffset = _startingContentOffset; } _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); // TODO: restore scrollView state // This is temporary solution. Have to implement the save and restore scrollView state UIScrollView *superscrollView = _lastScrollView; do { CGSize contentSize = CGSizeMake(MAX(superscrollView.contentSize.width, CGRectGetWidth(superscrollView.frame)), MAX(superscrollView.contentSize.height, CGRectGetHeight(superscrollView.frame))); CGFloat minimumY = contentSize.height-CGRectGetHeight(superscrollView.frame); if (minimumY<superscrollView.contentOffset.y) { superscrollView.contentOffset = CGPointMake(superscrollView.contentOffset.x, minimumY); _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentOffset to : %@",[superscrollView _IQDescription],NSStringFromCGPoint(superscrollView.contentOffset)]); } } while ((superscrollView = (UIScrollView*)[superscrollView superviewOfClassType:[UIScrollView class]])); } completion:NULL]; } // Setting rootViewController frame to it's original position. // (Bug ID: #18) if (!CGRectEqualToRect(_topViewBeginRect, CGRectZero) && _rootViewController) { //frame size needs to be adjusted on iOS8 due to orientation API changes. if (IQ_IS_IOS8_OR_GREATER) { _topViewBeginRect.size = _rootViewController.view.frame.size; } //Used UIViewAnimationOptionBeginFromCurrentState to minimize strange animations. [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ NSLayoutConstraint *constraint = [[_textFieldView viewController] IQLayoutGuideConstraint]; //If done LayoutGuide tweak if (constraint && ((constraint.firstItem == [[_textFieldView viewController] topLayoutGuide] || constraint.secondItem == [[_textFieldView viewController] topLayoutGuide]) || (constraint.firstItem == [[_textFieldView viewController] bottomLayoutGuide] || constraint.secondItem == [[_textFieldView viewController] bottomLayoutGuide]))) { constraint.constant = _layoutGuideConstraintInitialConstant; [_rootViewController.view setNeedsLayout]; [_rootViewController.view layoutIfNeeded]; } else { _IQShowLog([NSString stringWithFormat:@"Restoring %@ frame to : %@",[_rootViewController _IQDescription],NSStringFromCGRect(_topViewBeginRect)]); // Setting it's new frame [_rootViewController.view setFrame:_topViewBeginRect]; //Animating content if needed (Bug ID: #204) if (_layoutIfNeededOnUpdate) { //Animating content (Bug ID: #160) [_rootViewController.view setNeedsLayout]; [_rootViewController.view layoutIfNeeded]; } } } completion:NULL]; _rootViewController = nil; } //Reset all values _lastScrollView = nil; _kbSize = CGSizeZero; _startingContentInsets = UIEdgeInsetsZero; _startingScrollIndicatorInsets = UIEdgeInsetsZero; _startingContentOffset = CGPointZero; // topViewBeginRect = CGRectZero; //Commented due to #82 _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } /* UIKeyboardDidHideNotification. So topViewBeginRect can be set to CGRectZero. */ - (void)keyboardDidHide:(NSNotification*)aNotification { _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); _topViewBeginRect = CGRectZero; _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } #pragma mark - UITextFieldView Delegate methods /** UITextFieldTextDidBeginEditingNotification, UITextViewTextDidBeginEditingNotification. Fetching UITextFieldView object. */ -(void)textFieldViewDidBeginEditing:(NSNotification*)notification { _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); // Getting object _textFieldView = notification.object; if (_overrideKeyboardAppearance == YES) { UITextField *textField = (UITextField*)_textFieldView; //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]; } } // Saving textFieldView current frame to use it with canAdjustTextView if textViewFrame has already not been changed. //Added _isTextFieldViewFrameChanged check. (Bug ID: #92) if (_keyboardManagerFlags.isTextFieldViewFrameChanged == NO && _textFieldView) { _textFieldViewIntialFrame = _textFieldView.frame; _IQShowLog([NSString stringWithFormat:@"Saving %@ Initial frame :%@",[_textFieldView _IQDescription],NSStringFromCGRect(_textFieldViewIntialFrame)]); } //If autoToolbar enable, then add toolbar on all the UITextField/UITextView's if required. if (_enableAutoToolbar) { _IQShowLog(@"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) { [UIView animateWithDuration:0.00001 delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ [self addToolbarIfRequired]; } completion:^(BOOL finished) { //RestoringTextView before reloading inputViews if (_keyboardManagerFlags.isTextFieldViewFrameChanged) { _keyboardManagerFlags.isTextFieldViewFrameChanged = NO; _textFieldView.frame = _textFieldViewIntialFrame; } //On textView toolbar didn't appear on first time, so forcing textView to reload it's inputViews. [_textFieldView reloadInputViews]; }]; } //Else adding toolbar else { [self addToolbarIfRequired]; } } if (_enable == NO) { _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); return; } //Adding Geture recognizer to window (Enhancement ID: #14) [_textFieldView.window addGestureRecognizer:_tapGesture]; if (_keyboardManagerFlags.isKeyboardShowing == NO) // (Bug ID: #5) { // 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]; _topViewBeginRect = _rootViewController.view.frame; _IQShowLog([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) { //Getting textField viewController UIViewController *textFieldViewController = [_textFieldView viewController]; BOOL shouldIgnore = NO; for (Class disabledClass in _disabledClasses) { //If viewController is kind of disabled viewController class, then ignoring to adjust view. if ([textFieldViewController isKindOfClass:disabledClass]) { shouldIgnore = YES; break; } } //If shouldn't ignore. if (shouldIgnore == NO) { // keyboard is already showing. adjust frame. [self adjustFrame]; } } _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } /** UITextFieldTextDidEndEditingNotification, UITextViewTextDidEndEditingNotification. Removing fetched object. */ -(void)textFieldViewDidEndEditing:(NSNotification*)notification { _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); //Removing gesture recognizer (Enhancement ID: #14) [_textFieldView.window removeGestureRecognizer:_tapGesture]; // We check if there's a change in original frame or not. if(_keyboardManagerFlags.isTextFieldViewFrameChanged == YES) { [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _keyboardManagerFlags.isTextFieldViewFrameChanged = NO; _IQShowLog([NSString stringWithFormat:@"Restoring %@ frame to : %@",[_textFieldView _IQDescription],NSStringFromCGRect(_textFieldViewIntialFrame)]); //Setting textField to it's initial frame _textFieldView.frame = _textFieldViewIntialFrame; } completion:NULL]; } //Setting object to nil _textFieldView = nil; _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } /** UITextViewTextDidChangeNotificationBug, fix for iOS 7.0.x - http://stackoverflow.com/questions/18966675/uitextview-in-ios7-clips-the-last-line-of-text-string */ -(void)textFieldViewDidChange:(NSNotification*)notification // (Bug ID: #18) { if (_shouldFixTextViewClip == YES) { UITextView *textView = (UITextView *)notification.object; CGRect line = [textView caretRectForPosition: textView.selectedTextRange.start]; CGFloat overflow = CGRectGetMaxY(line) - (textView.contentOffset.y + CGRectGetHeight(textView.bounds) - textView.contentInset.bottom - textView.contentInset.top); //Added overflow conditions (Bug ID: 95) if ( overflow > 0 && overflow < FLT_MAX) { // We are at the bottom of the visible text and introduced a line feed, scroll down (iOS 7 does not do it) // Scroll caret to visible area CGPoint offset = textView.contentOffset; offset.y += overflow + 7; // leave 7 pixels margin // Cannot animate with setContentOffset:animated: or caret will not appear [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ [textView setContentOffset:offset]; } completion:NULL]; } } } #pragma mark - UIInterfaceOrientation Change 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 { _IQShowLog([NSString stringWithFormat:@"****** %@ started ******",NSStringFromSelector(_cmd)]); //If textFieldViewInitialRect is saved then restore it.(UITextView case @canAdjustTextView) if (_keyboardManagerFlags.isTextFieldViewFrameChanged == YES) { //Due to orientation callback we need to set it's original position. [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _keyboardManagerFlags.isTextFieldViewFrameChanged = NO; _IQShowLog([NSString stringWithFormat:@"Restoring %@ frame to : %@",[_textFieldView _IQDescription],NSStringFromCGRect(_textFieldViewIntialFrame)]); //Setting textField to it's initial frame _textFieldView.frame = _textFieldViewIntialFrame; } completion:NULL]; } _IQShowLog([NSString stringWithFormat:@"****** %@ ended ******",NSStringFromSelector(_cmd)]); } #pragma mark AutoResign methods /** Resigning on tap gesture. */ - (void)tapRecognized:(UITapGestureRecognizer*)gesture // (Enhancement ID: #14) { if (gesture.state == UIGestureRecognizerStateEnded) { //Resigning currently responder textField. [self resignFirstResponder]; } } /** Note: returning YES is guaranteed to allow simultaneous recognition. returning NO is not guaranteed to prevent simultaneous recognition, as the other gesture's delegate may return YES. */ - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return NO; } /** To not detect touch events in a subclass of UIControl, these may have added their own selector for specific work */ -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(<Back button etc...) (Bug ID: #145) return ([[touch view] isKindOfClass:[UIControl class]] || [[touch view] isKindOfClass:[UINavigationBar class]]) ? NO : YES; } /** Resigning textField. */ - (BOOL)resignFirstResponder { if (_textFieldView) { // Retaining textFieldView UIView *textFieldRetain = _textFieldView; //Resigning first responder BOOL isResignFirstResponder = [_textFieldView resignFirstResponder]; // If it refuses then becoming it as first responder again. (Bug ID: #96) if (isResignFirstResponder == NO) { //If it refuses to resign then becoming it first responder again for getting notifications callback. [textFieldRetain becomeFirstResponder]; _IQShowLog([NSString stringWithFormat:@"Refuses to Resign first responder: %@",[_textFieldView _IQDescription]]); } return isResignFirstResponder; } else { return NO; } } /** Returns YES if can navigate to previous responder textField/textView, otherwise NO. */ -(BOOL)canGoPrevious { //Getting all responder view's. NSArray *textFields = [self responderViews]; //Getting index of current textField. NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not first textField. then it's previous object can becomeFirstResponder. if (index != NSNotFound && index > 0) { return YES; } else { return NO; } } /** Returns YES if can navigate to next responder textField/textView, otherwise NO. */ -(BOOL)canGoNext { //Getting all responder view's. NSArray *textFields = [self responderViews]; //Getting index of current textField. NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not last textField. then it's next object becomeFirstResponder. if (index != NSNotFound && index < textFields.count-1) { return YES; } else { return NO; } } /** Navigate to previous responder textField/textView. */ -(BOOL)goPrevious { //Getting all responder view's. NSArray *textFields = [self responderViews]; //Getting index of current textField. NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not first textField. then it's previous object becomeFirstResponder. if (index != NSNotFound && index > 0) { UITextField *nextTextField = [textFields objectAtIndex:index-1]; // Retaining textFieldView UIView *textFieldRetain = _textFieldView; BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) if (isAcceptAsFirstResponder == NO) { //If next field refuses to become first responder then restoring old textField as first responder. [textFieldRetain becomeFirstResponder]; _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); } return isAcceptAsFirstResponder; } else { return NO; } } /** Navigate to next responder textField/textView. */ -(BOOL)goNext { //Getting all responder view's. NSArray *textFields = [self responderViews]; //Getting index of current textField. NSUInteger index = [textFields indexOfObject:_textFieldView]; //If it is not last textField. then it's next object becomeFirstResponder. if (index != NSNotFound && index < textFields.count-1) { UITextField *nextTextField = [textFields objectAtIndex:index+1]; // Retaining textFieldView UIView *textFieldRetain = _textFieldView; BOOL isAcceptAsFirstResponder = [nextTextField becomeFirstResponder]; // If it refuses then becoming previous textFieldView as first responder again. (Bug ID: #96) if (isAcceptAsFirstResponder == NO) { //If next field refuses to become first responder then restoring old textField as first responder. [textFieldRetain becomeFirstResponder]; _IQShowLog([NSString stringWithFormat:@"Refuses to become first responder: %@",[nextTextField _IQDescription]]); } return isAcceptAsFirstResponder; } else { return NO; } } #pragma mark AutoToolbar methods /** Get all UITextField/UITextView siblings of textFieldView. */ -(NSArray*)responderViews { UIView *superConsideredView; //If find any consider responderView in it's upper hierarchy then will get deepResponderView. for (Class consideredClass in _toolbarPreviousNextConsideredClass) { superConsideredView = [_textFieldView superviewOfClassType:consideredClass]; if (superConsideredView != nil) break; } //If there is a superConsideredView in view's hierarchy, then fetching all it's subview that responds. No sorting for superConsideredView, it's by subView position. (Enhancement ID: #22) if (superConsideredView) { return [superConsideredView deepResponderViews]; } //Otherwise fetching all the siblings else { NSArray *textFields = [_textFieldView responderSiblings]; //Sorting textFields according to behaviour switch (_toolbarManageBehaviour) { //If autoToolbar behaviour is bySubviews, then returning it. case IQAutoToolbarBySubviews: return textFields; break; //If autoToolbar behaviour is by tag, then sorting it according to tag property. case IQAutoToolbarByTag: return [textFields sortedArrayByTag]; break; //If autoToolbar behaviour is by tag, then sorting it according to tag property. case IQAutoToolbarByPosition: return [textFields sortedArrayByPosition]; break; default: return nil; break; } } } /** Add toolbar if it is required to add on textFields and it's siblings. */ -(void)addToolbarIfRequired { UIViewController *textFieldViewController = [_textFieldView viewController]; //If found any toolbar disabled classes then return. Will not add any toolbar. for (Class disabledToolbarClass in _disabledToolbarClasses) if ([textFieldViewController isKindOfClass:disabledToolbarClass]) { [self removeToolbarIfRequired]; return; } // Getting all the sibling textFields. NSArray *siblings = [self responderViews]; // If only one object is found, then adding only Done button. if (siblings.count==1) { UITextField *textField = nil; if ([siblings count]) textField = [siblings objectAtIndex:0]; //Not using firstObject method because iOS5 doesn't not support 'firstObject' method. //Either there is no inputAccessoryView or if accessoryView is not appropriate for current situation(There is Previous/Next/Done toolbar). //setInputAccessoryView: check (Bug ID: #307) if ([textField respondsToSelector:@selector(setInputAccessoryView:)] && (![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]; } //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]; } else { //Now adding textField placeholder text as title of IQToolbar (Enhancement ID: #27) [textField addDoneOnKeyboardWithTarget:self action:@selector(doneAction:) shouldShowPlaceholder:_shouldShowTextFieldPlaceholder]; } textField.inputAccessoryView.tag = kIQDoneButtonToolbarTag; // (Bug ID: #78) } if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && textField.inputAccessoryView.tag == kIQDoneButtonToolbarTag) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; //Bar style according to keyboard appearance if ([textField respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)textField keyboardAppearance]) { case UIKeyboardAppearanceAlert: { toolbar.barStyle = UIBarStyleBlack; [toolbar setTintColor:[UIColor whiteColor]]; } break; default: { toolbar.barStyle = UIBarStyleDefault; //Setting toolbar tintColor // (Enhancement ID: #30) if (_shouldToolbarUsesTextFieldTintColor) { toolbar.tintColor = [textField tintColor]; } else if (_toolbarTintColor) { toolbar.tintColor = _toolbarTintColor; } else { toolbar.tintColor = [UIColor blackColor]; } } break; } } //If need to show placeholder if (_shouldShowTextFieldPlaceholder && textField.shouldHideTitle == NO) { //Updating placeholder //(Bug ID: #148) if ([textField respondsToSelector:@selector(placeholder)]) { if (toolbar.title == nil || [toolbar.title isEqualToString:textField.placeholder] == NO) [toolbar setTitle:textField.placeholder]; } //If doesn't recognised 'placeholder' method, then setting it's title to nil //(Bug ID: #272) else [toolbar setTitle:nil]; //Setting toolbar title font. // (Enhancement ID: #30) if (_placeholderFont && [_placeholderFont isKindOfClass:[UIFont class]]) [toolbar setTitleFont:_placeholderFont]; } else { //Updating placeholder //(Bug ID: #272) [toolbar setTitle:nil]; } } } else if(siblings.count) { // If more than 1 textField is found. then adding previous/next/done buttons on it. for (UITextField *textField in siblings) { //Either there is no inputAccessoryView or if accessoryView is not appropriate for current situation(There is Done toolbar). //setInputAccessoryView: check (Bug ID: #307) if ([textField respondsToSelector:@selector(setInputAccessoryView:)] && (![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]; } //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]; } 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]; } textField.inputAccessoryView.tag = kIQPreviousNextButtonToolbarTag; // (Bug ID: #78) } if ([textField.inputAccessoryView isKindOfClass:[IQToolbar class]] && textField.inputAccessoryView.tag == kIQPreviousNextButtonToolbarTag) { IQToolbar *toolbar = (IQToolbar*)[textField inputAccessoryView]; //Bar style according to keyboard appearance if ([textField respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)textField keyboardAppearance]) { case UIKeyboardAppearanceAlert: { toolbar.barStyle = UIBarStyleBlack; [toolbar setTintColor:[UIColor whiteColor]]; } break; default: { toolbar.barStyle = UIBarStyleDefault; //Setting toolbar tintColor // (Enhancement ID: #30) if (_shouldToolbarUsesTextFieldTintColor) { toolbar.tintColor = [textField tintColor]; } else if (_toolbarTintColor) { toolbar.tintColor = _toolbarTintColor; } else { toolbar.tintColor = [UIColor blackColor]; } } break; } } //If need to show placeholder if (_shouldShowTextFieldPlaceholder && textField.shouldHideTitle == NO) { //Updating placeholder //(Bug ID: #148) if ([textField respondsToSelector:@selector(placeholder)]) { if (toolbar.title == nil || [toolbar.title isEqualToString:textField.placeholder] == NO) [toolbar setTitle:textField.placeholder]; } //If doesn't recognised 'placeholder' method, then setting it's title to nil //(Bug ID: #272) else [toolbar setTitle:nil]; //Setting toolbar title font. // (Enhancement ID: #30) if (_placeholderFont && [_placeholderFont isKindOfClass:[UIFont class]]) [toolbar setTitleFont:_placeholderFont]; } else { //Updating placeholder //(Bug ID: #272) [toolbar setTitle:nil]; } //In case of UITableView (Special), the next/previous buttons has to be refreshed everytime. (Bug ID: #56) // If firstTextField, then previous should not be enabled. if ([siblings objectAtIndex:0] == textField) { [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]; } } } } } /** Remove any toolbar if it is IQToolbar. */ -(void)removeToolbarIfRequired // (Bug ID: #18) { // Getting all the sibling textFields. NSArray *siblings = [self responderViews]; 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))) { textField.inputAccessoryView = nil; } } } #pragma mark previous/next/done functionality /** previousAction. */ -(void)previousAction:(id)segmentedControl { //If user wants to play input Click sound. Then Play Input Click Sound. if (_shouldPlayInputClicks) { [[UIDevice currentDevice] playInputClick]; } if ([self canGoPrevious]) { UIView *textFieldRetain = _textFieldView; BOOL isAcceptAsFirstResponder = [self goPrevious]; if (isAcceptAsFirstResponder == YES && textFieldRetain.previousInvocation) { [textFieldRetain.previousInvocation invoke]; } } } /** nextAction. */ -(void)nextAction:(id)segmentedControl { //If user wants to play input Click sound. Then Play Input Click Sound. if (_shouldPlayInputClicks) { [[UIDevice currentDevice] playInputClick]; } if ([self canGoNext]) { UIView *textFieldRetain = _textFieldView; BOOL isAcceptAsFirstResponder = [self goNext]; if (isAcceptAsFirstResponder == YES && textFieldRetain.nextInvocation) { [textFieldRetain.nextInvocation invoke]; } } } /** doneAction. Resigning current textField. */ -(void)doneAction:(IQBarButtonItem*)barButton { //If user wants to play input Click sound. Then Play Input Click Sound. if (_shouldPlayInputClicks) { [[UIDevice currentDevice] playInputClick]; } UIView *textFieldRetain = _textFieldView; BOOL isResignedFirstResponder = [self resignFirstResponder]; if (isResignedFirstResponder == YES && textFieldRetain.doneInvocation) { [textFieldRetain.doneInvocation invoke]; } } #pragma mark - Tracking untracking /** Disable adjusting view in disabledClass */ -(void)disableInViewControllerClass:(Class)disabledClass { [self disableDistanceHandlingInViewControllerClass:disabledClass]; } -(void)disableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass { [_disabledClasses addObject:disabledClass]; } /** Re-enable adjusting textField in disabledClass */ -(void)removeDisableInViewControllerClass:(Class)disabledClass { [self removeDisableDistanceHandlingInViewControllerClass:disabledClass]; } -(void)removeDisableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass { [_disabledClasses removeObject:disabledClass]; } //Returns all disabled classes -(NSSet*)disabledInViewControllerClasses { return [_disabledClasses copy]; } /** Disable automatic toolbar creation in in toolbarDisabledClass */ -(void)disableToolbarInViewControllerClass:(Class)toolbarDisabledClass { [_disabledToolbarClasses addObject:toolbarDisabledClass]; } /** Re-enable automatic toolbar creation in in toolbarDisabledClass */ -(void)removeDisableToolbarInViewControllerClass:(Class)toolbarDisabledClass { [_disabledToolbarClasses removeObject:toolbarDisabledClass]; } //Returns all toolbar disabled classes -(NSSet *)disabledToolbarInViewControllerClasses { return [_disabledToolbarClasses copy]; } /** Consider provided customView class as superView of all inner textField for calculating next/previous button logic. */ -(void)considerToolbarPreviousNextInViewClass:(Class)toolbarPreviousNextConsideredClass { [_toolbarPreviousNextConsideredClass addObject:toolbarPreviousNextConsideredClass]; } /** Remove Consideration for provided customView class as superView of all inner textField for calculating next/previous button logic. */ -(void)removeConsiderToolbarPreviousNextInViewClass:(Class)toolbarPreviousNextConsideredClass { [_toolbarPreviousNextConsideredClass removeObject:toolbarPreviousNextConsideredClass]; } /** Returns All toolbar considered classes */ -(NSSet* _Nonnull)consideredToolbarPreviousNextViewClasses { return [_toolbarPreviousNextConsideredClass copy]; } @end void _IQShowLog(NSString *logString) { #if IQKEYBOARDMANAGER_DEBUG NSLog(@"IQKeyboardManager: %@",logString); #endif } Pods/IQKeyboardManager/IQKeyBoardManager/IQKeyboardReturnKeyHandler.h
New file @@ -0,0 +1,99 @@ // // IQKeyboardReturnKeyHandler.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQKeyboardManagerConstants.h" #import <Foundation/NSObject.h> #import <Foundation/NSObjCRuntime.h> #import <UIKit/UITextField.h> #import <UIKit/UITextView.h> @class UITextField,UIView, UIViewController; /** Manages the return key to work like next/done in a view hierarchy. */ @interface IQKeyboardReturnKeyHandler : NSObject ///---------------------- /// @name Initializations ///---------------------- /** Add all the textFields available in UIViewController's view. */ -(nonnull instancetype)initWithViewController:(nullable UIViewController*)controller NS_DESIGNATED_INITIALIZER; /** Unavailable. Please use initWithViewController: or init method */ -(nonnull instancetype)initWithCoder:(nullable NSCoder *)aDecoder NS_UNAVAILABLE; ///--------------- /// @name Settings ///--------------- /** Delegate of textField/textView. */ @property(nullable, nonatomic, weak) id<UITextFieldDelegate,UITextViewDelegate> delegate; /** Set the last textfield return key type. Default is UIReturnKeyDefault. */ @property(nonatomic, assign) UIReturnKeyType lastTextFieldReturnKeyType; ///---------------------------------------------- /// @name Registering/Unregistering textFieldView ///---------------------------------------------- /** Should pass UITextField/UITextView intance. Assign textFieldView delegate to self, change it's returnKeyType. @param textFieldView UITextField/UITextView object to register. */ -(void)addTextFieldView:(nonnull UIView*)textFieldView; /** Should pass UITextField/UITextView intance. Restore it's textFieldView delegate and it's returnKeyType. @param textFieldView UITextField/UITextView object to unregister. */ -(void)removeTextFieldView:(nonnull UIView*)textFieldView; /** Add all the UITextField/UITextView responderView's. @param UIView 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. */ -(void)removeResponderFromView:(nonnull UIView*)view; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQKeyboardReturnKeyHandler.m
New file @@ -0,0 +1,370 @@ // // IQKeyboardReturnKeyHandler.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQKeyboardReturnKeyHandler.h" #import "IQKeyboardManager.h" #import "IQUIView+Hierarchy.h" #import "IQNSArray+Sort.h" #import <Foundation/NSSet.h> #import <UIKit/UITextField.h> #import <UIKit/UITextView.h> #import <UIKit/UIViewController.h> NSString *const kIQTextField = @"kIQTextField"; NSString *const kIQTextFieldDelegate = @"kIQTextFieldDelegate"; NSString *const kIQTextFieldReturnKeyType = @"kIQTextFieldReturnKeyType"; @interface IQKeyboardReturnKeyHandler ()<UITextFieldDelegate,UITextViewDelegate> -(void)updateReturnKeyTypeOnTextField:(UIView*)textField; @end @implementation IQKeyboardReturnKeyHandler { NSMutableSet *textFieldInfoCache; } @synthesize lastTextFieldReturnKeyType = _lastTextFieldReturnKeyType; @synthesize delegate = _delegate; - (instancetype)init { self = [self initWithViewController:nil]; return self; } -(instancetype)initWithViewController:(UIViewController*)controller { self = [super init]; if (self) { textFieldInfoCache = [[NSMutableSet alloc] init]; [self addResponderFromView:controller.view]; } return self; } -(NSDictionary*)textFieldCachedInfo:(UITextField*)textField { for (NSDictionary *infoDict in textFieldInfoCache) if ([infoDict objectForKey:kIQTextField] == textField) return infoDict; return nil; } #pragma mark - Add/Remove TextFields -(void)addResponderFromView:(UIView*)view { NSArray *textFields = [view deepResponderViews]; for (UITextField *textField in textFields) [self addTextFieldView:textField]; } -(void)removeResponderFromView:(UIView*)view { NSArray *textFields = [view deepResponderViews]; for (UITextField *textField in textFields) [self removeTextFieldView:textField]; } -(void)removeTextFieldView:(UITextField*)textField { NSDictionary *dict = [self textFieldCachedInfo:textField]; if (dict) { textField.keyboardType = [[dict objectForKey:kIQTextFieldReturnKeyType] integerValue]; textField.delegate = [dict objectForKey:kIQTextFieldDelegate]; [textFieldInfoCache removeObject:dict]; } } -(void)addTextFieldView:(UITextField*)textField { NSMutableDictionary *dictInfo = [[NSMutableDictionary alloc] init]; [dictInfo setObject:textField forKey:kIQTextField]; [dictInfo setObject:[NSNumber numberWithInteger:textField.returnKeyType] forKey:kIQTextFieldReturnKeyType]; if (textField.delegate) [dictInfo setObject:textField.delegate forKey:kIQTextFieldDelegate]; [textField setDelegate:self]; [textFieldInfoCache addObject:dictInfo]; } -(void)updateReturnKeyTypeOnTextField:(UIView*)textField { UIView *superConsideredView; //If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347) for (Class consideredClass in [[IQKeyboardManager sharedManager] consideredToolbarPreviousNextViewClasses]) { superConsideredView = [textField superviewOfClassType:consideredClass]; if (superConsideredView != nil) break; } NSArray *textFields = nil; //If there is a tableView in view's hierarchy, then fetching all it's subview that responds. No sorting for tableView, it's by subView position. if (superConsideredView) // // (Enhancement ID: #22) { textFields = [superConsideredView deepResponderViews]; } //Otherwise fetching all the siblings else { textFields = [textField responderSiblings]; //Sorting textFields according to behaviour switch ([[IQKeyboardManager sharedManager] toolbarManageBehaviour]) { //If needs to sort it by tag case IQAutoToolbarByTag: textFields = [textFields sortedArrayByTag]; break; //If needs to sort it by Position case IQAutoToolbarByPosition: textFields = [textFields sortedArrayByPosition]; break; default: break; } } //If it's the last textField in responder view, else next [(UITextField*)textField setReturnKeyType:(([textFields lastObject] == textField) ? self.lastTextFieldReturnKeyType : UIReturnKeyNext)]; } #pragma mark - Goto next or Resign. -(void)goToNextResponderOrResign:(UIView*)textField { UIView *superConsideredView; //If find any consider responderView in it's upper hierarchy then will get deepResponderView. (Bug ID: #347) for (Class consideredClass in [[IQKeyboardManager sharedManager] consideredToolbarPreviousNextViewClasses]) { superConsideredView = [textField superviewOfClassType:consideredClass]; if (superConsideredView != nil) break; } NSArray *textFields = nil; //If there is a tableView in view's hierarchy, then fetching all it's subview that responds. No sorting for tableView, it's by subView position. if (superConsideredView) // // (Enhancement ID: #22) { textFields = [superConsideredView deepResponderViews]; } //Otherwise fetching all the siblings else { textFields = [textField responderSiblings]; //Sorting textFields according to behaviour switch ([[IQKeyboardManager sharedManager] toolbarManageBehaviour]) { //If needs to sort it by tag case IQAutoToolbarByTag: textFields = [textFields sortedArrayByTag]; break; //If needs to sort it by Position case IQAutoToolbarByPosition: textFields = [textFields sortedArrayByPosition]; break; default: break; } } //Getting index of current 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 objectAtIndex:index+1] becomeFirstResponder] : [textField resignFirstResponder]; } #pragma mark - TextField delegate - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if ([self.delegate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) return [self.delegate textFieldShouldBeginEditing:textField]; else return YES; } - (void)textFieldDidBeginEditing:(UITextField *)textField { [self updateReturnKeyTypeOnTextField:textField]; if ([self.delegate respondsToSelector:@selector(textFieldDidBeginEditing:)]) [self.delegate textFieldDidBeginEditing:textField]; } - (BOOL)textFieldShouldEndEditing:(UITextField *)textField { if ([self.delegate respondsToSelector:@selector(textFieldShouldEndEditing:)]) return [self.delegate textFieldShouldEndEditing:textField]; else return YES; } - (void)textFieldDidEndEditing:(UITextField *)textField { if ([self.delegate respondsToSelector:@selector(textFieldDidEndEditing:)]) [self.delegate textFieldDidEndEditing:textField]; } - (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]; else return YES; } - (BOOL)textFieldShouldClear:(UITextField *)textField { if ([self.delegate respondsToSelector:@selector(textFieldShouldClear:)]) return [self.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) { [self goToNextResponderOrResign:textField]; } return shouldReturn; } #pragma mark - TextView delegate - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { if ([self.delegate respondsToSelector:@selector(textViewShouldBeginEditing:)]) return [self.delegate textViewShouldBeginEditing:textView]; else return YES; } - (BOOL)textViewShouldEndEditing:(UITextView *)textView { if ([self.delegate respondsToSelector:@selector(textViewShouldEndEditing:)]) return [self.delegate textViewShouldEndEditing:textView]; else return YES; } - (void)textViewDidBeginEditing:(UITextView *)textView { [self updateReturnKeyTypeOnTextField:textView]; if ([self.delegate respondsToSelector:@selector(textViewDidBeginEditing:)]) [self.delegate textViewDidBeginEditing:textView]; } - (void)textViewDidEndEditing:(UITextView *)textView { if ([self.delegate respondsToSelector:@selector(textViewDidEndEditing:)]) [self.delegate textViewDidEndEditing:textView]; } - (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text { BOOL shouldReturn = YES; if ([self.delegate respondsToSelector:@selector(textView:shouldChangeTextInRange:replacementText:)]) shouldReturn = [self.delegate textView:textView shouldChangeTextInRange:range replacementText:text]; if (shouldReturn && [text isEqualToString:@"\n"]) { [self goToNextResponderOrResign:textView]; } return shouldReturn; } - (void)textViewDidChange:(UITextView *)textView { if ([self.delegate respondsToSelector:@selector(textViewDidChange:)]) [self.delegate textViewDidChange:textView]; } - (void)textViewDidChangeSelection:(UITextView *)textView { if ([self.delegate respondsToSelector:@selector(textViewDidChangeSelection:)]) [self.delegate textViewDidChangeSelection:textView]; } - (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]; 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]; else return YES; } -(void)dealloc { for (NSDictionary *dict in textFieldInfoCache) { UITextField *textField = [dict objectForKey:kIQTextField]; textField.keyboardType = [[dict objectForKey:kIQTextFieldReturnKeyType] integerValue]; textField.delegate = [dict objectForKey:kIQTextFieldDelegate]; } [textFieldInfoCache removeAllObjects]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/IQTextView/IQTextView.h
New file @@ -0,0 +1,42 @@ // // IQTextView.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQKeyboardManagerConstants.h" #import <UIKit/UITextView.h> /** UITextView with placeholder support */ @interface IQTextView : UITextView /** Set textView's placeholder text. Default is nil. */ @property(nullable, nonatomic,copy) NSString *placeholder; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQTextView/IQTextView.m
New file @@ -0,0 +1,133 @@ // // IQTextView.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQTextView.h" #import <UIKit/UILabel.h> #import <UIKit/UINibLoading.h> @interface IQTextView () -(void)refreshPlaceholder; @end @implementation IQTextView { UILabel *placeHolderLabel; } @synthesize placeholder = _placeholder; -(void)initialize { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshPlaceholder) name:UITextViewTextDidChangeNotification object:self]; } -(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self]; } - (instancetype)init { self = [super init]; if (self) { [self initialize]; } return self; } -(void)awakeFromNib { [super awakeFromNib]; [self initialize]; } -(void)refreshPlaceholder { if([[self text] length]) { [placeHolderLabel setAlpha:0]; } else { [placeHolderLabel setAlpha:1]; } [self setNeedsLayout]; [self layoutIfNeeded]; } - (void)setText:(NSString *)text { [super setText:text]; [self refreshPlaceholder]; } -(void)setFont:(UIFont *)font { [super setFont:font]; placeHolderLabel.font = self.font; [self setNeedsLayout]; [self layoutIfNeeded]; } -(void)layoutSubviews { [super layoutSubviews]; [placeHolderLabel sizeToFit]; placeHolderLabel.frame = CGRectMake(8, 8, CGRectGetWidth(self.frame)-16, CGRectGetHeight(placeHolderLabel.frame)); } -(void)setPlaceholder:(NSString *)placeholder { _placeholder = placeholder; if ( placeHolderLabel == nil ) { placeHolderLabel = [[UILabel alloc] init]; placeHolderLabel.autoresizingMask = (UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight); placeHolderLabel.lineBreakMode = NSLineBreakByWordWrapping; placeHolderLabel.numberOfLines = 0; placeHolderLabel.font = self.font; placeHolderLabel.backgroundColor = [UIColor clearColor]; placeHolderLabel.textColor = [UIColor colorWithWhite:0.7 alpha:1.0]; placeHolderLabel.alpha = 0; [self addSubview:placeHolderLabel]; } placeHolderLabel.text = self.placeholder; [self refreshPlaceholder]; } //When any text changes on textField, the delegate getter is called. At this time we refresh the textView's placeholder -(id<UITextViewDelegate>)delegate { [self refreshPlaceholder]; return [super delegate]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQBarButtonItem.h
New file @@ -0,0 +1,32 @@ // // IQBarButtonItem.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIBarButtonItem.h> /** IQBarButtonItem used for IQToolbar. */ @interface IQBarButtonItem : UIBarButtonItem @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQBarButtonItem.m
New file @@ -0,0 +1,105 @@ // // IQBarButtonItem.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQBarButtonItem.h" #import "IQToolbar.h" #import "IQKeyboardManagerConstantsInternal.h" @implementation IQBarButtonItem +(void)load { //Tint color [[self appearance] setTintColor:nil]; //Title [[self appearance] setTitlePositionAdjustment:UIOffsetZero forBarMetrics:UIBarMetricsDefault]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateNormal]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateHighlighted]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateDisabled]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateSelected]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateApplication]; [[self appearance] setTitleTextAttributes:nil forState:UIControlStateReserved]; //Background Image [[self appearance] setBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateDisabled barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateApplication barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateReserved barMetrics:UIBarMetricsDefault]; #ifdef __IPHONE_8_0 #if __IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_8_0 if (IQ_IS_IOS8_OR_GREATER) { [[self appearance] setBackgroundImage:nil forState:UIControlStateNormal style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateHighlighted style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateDisabled style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateSelected style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateApplication style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateReserved style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; } #endif #else [[self appearance] setBackgroundImage:nil forState:UIControlStateNormal style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateHighlighted style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateDisabled style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateSelected style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateApplication style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateReserved style:UIBarButtonItemStyleBordered barMetrics:UIBarMetricsDefault]; #endif [[self appearance] setBackgroundImage:nil forState:UIControlStateNormal style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateHighlighted style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateDisabled style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateSelected style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateApplication style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateReserved style:UIBarButtonItemStyleDone barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateNormal style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateHighlighted style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateDisabled style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateSelected style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateApplication style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forState:UIControlStateReserved style:UIBarButtonItemStylePlain barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundVerticalPositionAdjustment:0 forBarMetrics:UIBarMetricsDefault]; //Back Button [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateNormal barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateHighlighted barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateDisabled barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateSelected barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateApplication barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundImage:nil forState:UIControlStateReserved barMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonTitlePositionAdjustment:UIOffsetZero forBarMetrics:UIBarMetricsDefault]; [[self appearance] setBackButtonBackgroundVerticalPositionAdjustment:0 forBarMetrics:UIBarMetricsDefault]; } @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.h
New file @@ -0,0 +1,60 @@ // // IQTitleBarButtonItem.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <Foundation/NSObjCRuntime.h> #import "IQKeyboardManagerConstants.h" #import "IQBarButtonItem.h" /** BarButtonItem with title text. */ @interface IQTitleBarButtonItem : IQBarButtonItem /** Font to be used in bar button. Default is (system font 12.0 bold). */ @property(nullable, nonatomic, strong) UIFont *font; /** Initialize with frame and title. @param title Title of barButtonItem. */ -(nonnull instancetype)initWithTitle:(nullable NSString *)title NS_DESIGNATED_INITIALIZER; /** Unavailable. Please use initWithFrame:title: method */ -(nonnull instancetype)init NS_UNAVAILABLE; /** Unavailable. Please use initWithFrame:title: method */ -(nonnull instancetype)initWithCoder:(nullable NSCoder *)aDecoder NS_UNAVAILABLE; /** Unavailable. Please use initWithFrame:title: method */ + (nonnull instancetype)new NS_UNAVAILABLE; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.m
New file @@ -0,0 +1,82 @@ // // IQTitleBarButtonItem.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQTitleBarButtonItem.h" #import "IQKeyboardManagerConstants.h" #import "IQKeyboardManagerConstantsInternal.h" #import <UIKit/UILabel.h> @implementation IQTitleBarButtonItem { UIView *_titleView; UILabel *_titleLabel; } @synthesize font = _font; -(nonnull instancetype)initWithTitle:(nullable NSString *)title { self = [super init]; if (self) { _titleView = [[UIView alloc] init]; _titleView.backgroundColor = [UIColor clearColor]; _titleView.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; _titleLabel = [[UILabel alloc] init]; _titleLabel.numberOfLines = 0; [_titleLabel setTextColor:[UIColor grayColor]]; [_titleLabel setBackgroundColor:[UIColor clearColor]]; [_titleLabel setTextAlignment:NSTextAlignmentCenter]; _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight; [self setTitle:title]; [self setFont:[UIFont systemFontOfSize:13.0]]; [_titleView addSubview:_titleLabel]; self.customView = _titleView; self.enabled = NO; } return self; } -(void)setFont:(UIFont *)font { _font = font; if (font) { _titleLabel.font = font; } else { _titleLabel.font = [UIFont systemFontOfSize:13]; } } -(void)setTitle:(NSString *)title { [super setTitle:title]; _titleLabel.text = title; } @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQToolbar.h
New file @@ -0,0 +1,42 @@ // // IQToolbar.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIToolbar.h> /** IQToolbar for IQKeyboardManager. */ @interface IQToolbar : UIToolbar <UIInputViewAudioFeedback> /** Title font for toolbar. */ @property(nullable, nonatomic, strong) UIFont *titleFont; /** Toolbar title */ @property(nullable, nonatomic, strong) NSString *title; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQToolbar.m
New file @@ -0,0 +1,210 @@ // // IQToolbar.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQToolbar.h" #import "IQKeyboardManagerConstantsInternal.h" #import "IQTitleBarButtonItem.h" #import "IQUIView+Hierarchy.h" #import <UIKit/UIViewController.h> @implementation IQToolbar @synthesize titleFont = _titleFont; @synthesize title = _title; Class IQUIToolbarTextButtonClass; Class IQUIToolbarButtonClass; +(void)load { IQUIToolbarTextButtonClass = NSClassFromString(@"UIToolbarTextButton"); IQUIToolbarButtonClass = NSClassFromString(@"UIToolbarButton"); //Tint Color [[self appearance] setTintColor:nil]; [[self appearance] setBarTintColor:nil]; //Background image [[self appearance] setBackgroundImage:nil forToolbarPosition:UIBarPositionAny barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forToolbarPosition:UIBarPositionBottom barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forToolbarPosition:UIBarPositionTop barMetrics:UIBarMetricsDefault]; [[self appearance] setBackgroundImage:nil forToolbarPosition:UIBarPositionTopAttached barMetrics:UIBarMetricsDefault]; //Shadow image [[self appearance] setShadowImage:nil forToolbarPosition:UIBarPositionAny]; [[self appearance] setShadowImage:nil forToolbarPosition:UIBarPositionBottom]; [[self appearance] setShadowImage:nil forToolbarPosition:UIBarPositionTop]; [[self appearance] setShadowImage:nil forToolbarPosition:UIBarPositionTopAttached]; //Background color [[self appearance] setBackgroundColor:nil]; } -(void)initialize { [self sizeToFit]; self.autoresizingMask = UIViewAutoresizingFlexibleWidth;// | UIViewAutoresizingFlexibleHeight; self.translucent = YES; [self setTintColor:[UIColor blackColor]]; } - (instancetype)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { [self initialize]; } return self; } - (instancetype)initWithCoder:(NSCoder *)coder { self = [super initWithCoder:coder]; if (self) { [self initialize]; } return self; } -(CGSize)sizeThatFits:(CGSize)size { CGSize sizeThatFit = [super sizeThatFits:size]; sizeThatFit.height = 44; return sizeThatFit; } -(void)setTintColor:(UIColor *)tintColor { [super setTintColor:tintColor]; for (UIBarButtonItem *item in self.items) { [item setTintColor:tintColor]; } } -(void)setTitleFont:(UIFont *)titleFont { _titleFont = titleFont; for (UIBarButtonItem *item in self.items) { if ([item isKindOfClass:[IQTitleBarButtonItem class]]) { [(IQTitleBarButtonItem*)item setFont:titleFont]; } } } -(void)setTitle:(NSString *)title { _title = title; for (UIBarButtonItem *item in self.items) { if ([item isKindOfClass:[IQTitleBarButtonItem class]]) { [(IQTitleBarButtonItem*)item setTitle:title]; } } } -(void)layoutSubviews { [super layoutSubviews]; CGRect leftRect = CGRectNull; CGRect rightRect = CGRectNull; BOOL isTitleBarButtonFound = NO; NSArray *subviews = [self.subviews sortedArrayUsingComparator:^NSComparisonResult(UIView *view1, UIView *view2) { CGFloat x1 = CGRectGetMinX(view1.frame); CGFloat y1 = CGRectGetMinY(view1.frame); CGFloat x2 = CGRectGetMinX(view2.frame); CGFloat y2 = CGRectGetMinY(view2.frame); if (x1 < x2) return NSOrderedAscending; else if (x1 > x2) return NSOrderedDescending; //Else both y are same so checking for x positions else if (y1 < y2) return NSOrderedAscending; else if (y1 > y2) return NSOrderedDescending; else return NSOrderedSame; }]; for (UIView *barButtonItemView in subviews) { if (isTitleBarButtonFound == YES) { rightRect = barButtonItemView.frame; break; } else if ([barButtonItemView isMemberOfClass:[UIView class]]) { isTitleBarButtonFound = YES; } else if ([barButtonItemView isKindOfClass:IQUIToolbarTextButtonClass] || [barButtonItemView isKindOfClass:IQUIToolbarButtonClass]) { leftRect = barButtonItemView.frame; } } CGFloat x = 16; if (CGRectIsNull(leftRect) == false) { x = CGRectGetMaxX(leftRect) + 16; } CGFloat width = CGRectGetWidth(self.frame) - 32 - (CGRectIsNull(leftRect)?0:CGRectGetMaxX(leftRect)) - (CGRectIsNull(rightRect)?0:CGRectGetWidth(self.frame)-CGRectGetMinX(rightRect)); for (UIBarButtonItem *item in self.items) { if ([item isKindOfClass:[IQTitleBarButtonItem class]]) { CGRect titleRect = CGRectMake(x, 0, width, self.frame.size.height); item.customView.frame = titleRect; break; } } } #pragma mark - UIInputViewAudioFeedback delegate - (BOOL) enableInputClicksWhenVisible { return YES; } @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h
New file @@ -0,0 +1,357 @@ // // UIView+IQToolbar.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 <UIKit/UIView.h> @class UIBarButtonItem; /** UIView category methods to add IQToolbar on UIKeyboard. */ @interface UIView (IQToolbarAddition) ///------------------------- /// @name Title and Distance ///------------------------- /** If shouldHideTitle is YES, then title will not be added to the toolbar. Default to NO. */ @property (assign, nonatomic) BOOL shouldHideTitle; ///----------------------------------------- /// @name Customised Invocation Registration ///----------------------------------------- /** Additional target & action to do get callback action. Note that setting custom `previous` selector doesn't affect native `previous` functionality, this is just used to notifiy user to do additional work according to need. @param target Target object. @param action Target Selector. */ -(void)setCustomPreviousTarget:(nullable id)target action:(nullable SEL)action; /** Additional target & action to do get callback action. Note that setting custom `next` selector doesn't affect native `next` functionality, this is just used to notifiy user to do additional work according to need. @param target Target object. @param action Target Selector. */ -(void)setCustomNextTarget:(nullable id)target action:(nullable SEL)action; /** Additional target & action to do get callback action. Note that setting custom `done` selector doesn't affect native `done` functionality, this is just used to notifiy user to do additional work according to need. @param target Target object. @param action Target Selector. */ -(void)setCustomDoneTarget:(nullable id)target action:(nullable SEL)action; /** Customized Invocation to be called on previous arrow action. previousInvocation is internally created using setCustomPreviousTarget: method. */ @property (nullable, strong, nonatomic) NSInvocation *previousInvocation; /** Customized Invocation to be called on next arrow action. nextInvocation is internally created using setCustomNextTarget: method. */ @property (nullable, strong, nonatomic) NSInvocation *nextInvocation; /** Customized Invocation to be called on done action. doneInvocation is internally created using setCustomDoneTarget: method. */ @property (nullable, strong, nonatomic) NSInvocation *doneInvocation; ///------------ /// @name Done ///------------ /** Helper function to add Done button on keyboard. @param target Target object for selector. @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addDoneOnKeyboardWithTarget:(nullable id)target action:(nullable SEL)action; /** Helper function to add Done button on keyboard. @param target Target object for selector. @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addDoneOnKeyboardWithTarget:(nullable id)target action:(nullable SEL)action titleText:(nullable NSString*)titleText; /** Helper function to add Done button on keyboard. @param target Target object for selector. @param action Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addDoneOnKeyboardWithTarget:(nullable id)target action:(nullable SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; ///------------ /// @name Right ///------------ /** Helper function to add Right button on keyboard. @param text Title for rightBarButtonItem, usually 'Done'. @param target Target object for selector. @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addRightButtonOnKeyboardWithText:(nullable NSString*)text target:(nullable id)target action:(nullable SEL)action; /** Helper function to add Right button on keyboard. @param text Title for rightBarButtonItem, usually 'Done'. @param target Target object for selector. @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addRightButtonOnKeyboardWithText:(nullable NSString*)text target:(nullable id)target action:(nullable SEL)action titleText:(nullable NSString*)titleText; /** Helper function to add Right button on keyboard. @param text Title for rightBarButtonItem, usually 'Done'. @param target Target object for selector. @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addRightButtonOnKeyboardWithText:(nullable NSString*)text target:(nullable id)target action:(nullable SEL)action shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; /** Helper function to add Right button on keyboard. @param image Image icon to use as right button. @param target Target object for selector. @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; /** Helper function to add Right button on keyboard. @param image Image icon to use as right button. @param target Target object for selector. @param action Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addRightButtonOnKeyboardWithImage:(nullable UIImage*)image target:(nullable id)target action:(nullable SEL)action titleText:(nullable NSString*)titleText; ///------------------ /// @name Cancel/Done ///------------------ /** Helper function to add Cancel and Done button on keyboard. @param target Target object for selector. @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addCancelDoneOnKeyboardWithTarget:(nullable id)target cancelAction:(nullable SEL)cancelAction doneAction:(nullable SEL)doneAction; /** Helper function to add Cancel and Done button on keyboard. @param target Target object for selector. @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addCancelDoneOnKeyboardWithTarget:(nullable id)target cancelAction:(nullable SEL)cancelAction doneAction:(nullable SEL)doneAction titleText:(nullable NSString*)titleText; /** Helper function to add Cancel and Done button on keyboard. @param target Target object for selector. @param cancelAction Cancel button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addCancelDoneOnKeyboardWithTarget:(nullable id)target cancelAction:(nullable SEL)cancelAction doneAction:(nullable SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; ///----------------- /// @name Right/Left ///----------------- /** Helper function to add Left and Right button on keyboard. @param target Target object for selector. @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addLeftRightOnKeyboardWithTarget:(nullable id)target leftButtonTitle:(nullable NSString*)leftButtonTitle rightButtonTitle:(nullable NSString*)rightButtonTitle leftButtonAction:(nullable SEL)leftButtonAction rightButtonAction:(nullable SEL)rightButtonAction; /** Helper function to add Left and Right button on keyboard. @param target Target object for selector. @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addLeftRightOnKeyboardWithTarget:(nullable id)target leftButtonTitle:(nullable NSString*)leftButtonTitle rightButtonTitle:(nullable NSString*)rightButtonTitle leftButtonAction:(nullable SEL)leftButtonAction rightButtonAction:(nullable SEL)rightButtonAction titleText:(nullable NSString*)titleText; /** Helper function to add Left and Right button on keyboard. @param target Target object for selector. @param leftButtonTitle Title for leftBarButtonItem, usually 'Cancel'. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param leftButtonAction Left button action name. Usually 'cancelAction:(IQBarButtonItem*)item'. @param rightButtonAction Right button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addLeftRightOnKeyboardWithTarget:(nullable id)target leftButtonTitle:(nullable NSString*)leftButtonTitle rightButtonTitle:(nullable NSString*)rightButtonTitle leftButtonAction:(nullable SEL)leftButtonAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; ///------------------------- /// @name Previous/Next/Done ///------------------------- /** Helper function to add ArrowNextPrevious and Done button on keyboard. @param target Target object for selector. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addPreviousNextDoneOnKeyboardWithTarget:(nullable id)target previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction doneAction:(nullable SEL)doneAction; /** Helper function to add ArrowNextPrevious and Done button on keyboard. @param target Target object for selector. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addPreviousNextDoneOnKeyboardWithTarget:(nullable id)target previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction doneAction:(nullable SEL)doneAction titleText:(nullable NSString*)titleText; /** Helper function to add ArrowNextPrevious and Done button on keyboard. @param target Target object for selector. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param doneAction Done button action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addPreviousNextDoneOnKeyboardWithTarget:(nullable id)target previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction doneAction:(nullable SEL)doneAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; ///-------------------------- /// @name Previous/Next/Right ///-------------------------- /** Helper function to add ArrowNextPrevious and Right button on keyboard. @param target Target object for selector. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'. */ - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonTitle:(nullable NSString*)rightButtonTitle previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction; /** Helper function to add ArrowNextPrevious and Right button on keyboard. @param target Target object for selector. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonTitle:(nullable NSString*)rightButtonTitle previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction titleText:(nullable NSString*)titleText; /** Helper function to add ArrowNextPrevious and Right button on keyboard. @param target Target object for selector. @param rightButtonTitle Title for rightBarButtonItem, usually 'Done'. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonTitle:(nullable NSString*)rightButtonTitle previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; /** Helper function to add ArrowNextPrevious and Right button on keyboard. @param target Target object for selector. @param rightButtonImage Image icon to use as rightBarButtonItem. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param titleText text to show as title in IQToolbar'. */ - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction titleText:(nullable NSString*)titleText; /** Helper function to add ArrowNextPrevious and Right button on keyboard. @param target Target object for selector. @param rightButtonImage Image icon to use as rightBarButtonItem. @param previousAction Previous button action name. Usually 'previousAction:(id)item'. @param nextAction Next button action name. Usually 'nextAction:(id)item'. @param rightButtonAction RightBarButton action name. Usually 'doneAction:(IQBarButtonItem*)item'. @param shouldShowPlaceholder A boolean to indicate whether to show textField placeholder on IQToolbar'. */ - (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonImage:(nullable UIImage*)rightButtonImage previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction shouldShowPlaceholder:(BOOL)shouldShowPlaceholder; ///----------------------------------- /// @name Enable/Disable Previous/Next ///----------------------------------- /** Helper function to enable and disable previous next buttons. @param isPreviousEnabled BOOL to enable/disable previous button on keyboard. @param isNextEnabled BOOL to enable/disable next button on keyboard.. */ - (void)setEnablePrevious:(BOOL)isPreviousEnabled next:(BOOL)isNextEnabled; @end Pods/IQKeyboardManager/IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m
New file @@ -0,0 +1,764 @@ // // UIView+IQToolbar.m // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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 "IQUIView+IQKeyboardToolbar.h" #import "IQToolbar.h" #import "IQTitleBarButtonItem.h" #import "IQKeyboardManagerConstantsInternal.h" #import "IQBarButtonItem.h" #import "IQKeyboardManager.h" #import <UIKit/UIImage.h> #import <UIKit/UILabel.h> #import <objc/runtime.h> /*UIKeyboardToolbar Category implementation*/ @implementation UIView (IQToolbarAddition) -(void)setShouldHideTitle:(BOOL)shouldHideTitle { objc_setAssociatedObject(self, @selector(shouldHideTitle), [NSNumber numberWithBool:shouldHideTitle], OBJC_ASSOCIATION_RETAIN_NONATOMIC); if ([self respondsToSelector:@selector(placeholder)] && [self.inputAccessoryView respondsToSelector:@selector(setTitle:)]) { UITextField *textField = (UITextField*)self; IQToolbar *toolbar = (IQToolbar*)[self inputAccessoryView]; toolbar.title = textField.placeholder; } } -(BOOL)shouldHideTitle { NSNumber *shouldHideTitle = objc_getAssociatedObject(self, @selector(shouldHideTitle)); return [shouldHideTitle boolValue]; } -(void)setCustomPreviousTarget:(id)target action:(SEL)action { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]]; invocation.target = target; invocation.selector = action; UIView *selfObject = self; [invocation setArgument:&selfObject atIndex:2]; self.previousInvocation = invocation; } -(void)setCustomNextTarget:(id)target action:(SEL)action { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]]; invocation.target = target; invocation.selector = action; UIView *selfObject = self; [invocation setArgument:&selfObject atIndex:2]; self.nextInvocation = invocation; } -(void)setCustomDoneTarget:(id)target action:(SEL)action { NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[target methodSignatureForSelector:action]]; invocation.target = target; invocation.selector = action; UIView *selfObject = self; [invocation setArgument:&selfObject atIndex:2]; self.doneInvocation = invocation; } -(void)setPreviousInvocation:(NSInvocation *)previousInvocation { objc_setAssociatedObject(self, @selector(previousInvocation), previousInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(void)setNextInvocation:(NSInvocation *)nextInvocation { objc_setAssociatedObject(self, @selector(nextInvocation), nextInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(void)setDoneInvocation:(NSInvocation *)doneInvocation { objc_setAssociatedObject(self, @selector(doneInvocation), doneInvocation, OBJC_ASSOCIATION_RETAIN_NONATOMIC); } -(NSInvocation *)previousInvocation { return objc_getAssociatedObject(self, @selector(previousInvocation)); } -(NSInvocation *)nextInvocation { return objc_getAssociatedObject(self, @selector(nextInvocation)); } -(NSInvocation *)doneInvocation { return objc_getAssociatedObject(self, @selector(doneInvocation)); } #pragma mark - Private helper +(UIBarButtonItem*)flexibleBarButtonItem { static IQBarButtonItem *nilButton = nil; if (nilButton == nil) { nilButton = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; } return nilButton; } #pragma mark - Toolbar on UIKeyboard - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action titleText:(NSString*)titleText { // If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Right button IQBarButtonItem *doneButton = [[IQBarButtonItem alloc] initWithImage:image style:UIBarButtonItemStyleDone target:target action:action]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to textFieldPhoneNumber keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } - (void)addRightButtonOnKeyboardWithImage:(UIImage*)image target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addRightButtonOnKeyboardWithImage:image target:target action:action titleText:title]; } - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action titleText:(NSString*)titleText { // If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Right button IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:text style:UIBarButtonItemStyleDone target:target action:action]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to textFieldPhoneNumber keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:title]; } - (void)addRightButtonOnKeyboardWithText:(NSString*)text target:(id)target action:(SEL)action { [self addRightButtonOnKeyboardWithText:text target:target action:action titleText:nil]; } - (void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action titleText:(NSString*)titleText { // If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Done button IQBarButtonItem *doneButton = [[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:action]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to textFieldPhoneNumber keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addDoneOnKeyboardWithTarget:target action:action titleText:title]; } -(void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action { [self addDoneOnKeyboardWithTarget:target action:action titleText:nil]; } - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction titleText:(NSString*)titleText { // If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; //Left button IQBarButtonItem *cancelButton =[[IQBarButtonItem alloc] initWithTitle:leftTitle style:UIBarButtonItemStylePlain target:target action:leftAction]; [items addObject:cancelButton]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Right button IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:rightTitle style:UIBarButtonItemStyleDone target:target action:rightAction]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:title]; } - (void)addLeftRightOnKeyboardWithTarget:(id)target leftButtonTitle:(NSString*)leftTitle rightButtonTitle:(NSString*)rightTitle leftButtonAction:(SEL)leftAction rightButtonAction:(SEL)rightAction { [self addLeftRightOnKeyboardWithTarget:target leftButtonTitle:leftTitle rightButtonTitle:rightTitle leftButtonAction:leftAction rightButtonAction:rightAction titleText:nil]; } - (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction titleText:(NSString*)titleText { // If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; //Cancel button IQBarButtonItem *cancelButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:target action:cancelAction]; [items addObject:cancelButton]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Done button IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:title]; } -(void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction { [self addCancelDoneOnKeyboardWithTarget:target cancelAction:cancelAction doneAction:doneAction titleText:nil]; } - (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction titleText:(NSString*)titleText { //If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for phoneNumber keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; // UIBarButtonItem *prev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:target action:previousAction]; // UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:target action:nextAction]; #ifdef __IPHONE_8_0 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 //Minimum Target iOS 8+ // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; #else //Minimum Target iOS7+ UIImage *imageLeftArrow; UIImage *imageRightArrow; if (IQ_IS_IOS8_OR_GREATER) { // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; } else { imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; } #endif #else //Maximum target iOS 7 UIImage *imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; #endif //Previous button IQBarButtonItem *prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction]; [items addObject:prev]; //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; [fixed setWidth:20]; [items addObject:fixed]; //Next button IQBarButtonItem *next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction]; [items addObject:next]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Done button IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:target action:doneAction]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:title]; } -(void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction { [self addPreviousNextDoneOnKeyboardWithTarget:target previousAction:previousAction nextAction:nextAction doneAction:doneAction titleText:nil]; } - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonImage:(UIImage*)rightButtonImage previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText { //If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for phoneNumber keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; // UIBarButtonItem *prev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:target action:previousAction]; // UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:target action:nextAction]; #ifdef __IPHONE_8_0 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 //Minimum Target iOS 8+ // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; #else //Minimum Target iOS7+ UIImage *imageLeftArrow; UIImage *imageRightArrow; if (IQ_IS_IOS8_OR_GREATER) { // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; } else { imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; } #endif #else //Maximum target iOS 7 UIImage *imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; #endif //Previous button IQBarButtonItem *prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction]; [items addObject:prev]; //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; [fixed setWidth:20]; [items addObject:fixed]; //Next button IQBarButtonItem *next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction]; [items addObject:next]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Right button IQBarButtonItem *doneButton = [[IQBarButtonItem alloc] initWithImage:rightButtonImage style:UIBarButtonItemStyleDone target:target action:rightButtonAction]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to keyboard. [(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)shouldShowPlaceholder { NSString *title; if (shouldShowPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonImage:rightButtonImage previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title]; } - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction titleText:(NSString*)titleText { //If can't set InputAccessoryView. Then return if (![self respondsToSelector:@selector(setInputAccessoryView:)]) return; // Creating a toolBar for phoneNumber keyboard IQToolbar *toolbar = [[IQToolbar alloc] init]; if ([self respondsToSelector:@selector(keyboardAppearance)]) { switch ([(UITextField*)self keyboardAppearance]) { case UIKeyboardAppearanceAlert: toolbar.barStyle = UIBarStyleBlack; break; default: toolbar.barStyle = UIBarStyleDefault; break; } } NSMutableArray *items = [[NSMutableArray alloc] init]; // UIBarButtonItem *prev = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:105 target:target action:previousAction]; // UIBarButtonItem *next = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:106 target:target action:nextAction]; #ifdef __IPHONE_8_0 #if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_8_0 //Minimum Target iOS 8+ // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } UIImage *imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; #else //Minimum Target iOS7+ UIImage *imageLeftArrow; UIImage *imageRightArrow; if (IQ_IS_IOS8_OR_GREATER) { // Get the top level "bundle" which may actually be the framework NSBundle *mainBundle = [NSBundle bundleForClass:[IQKeyboardManager class]]; // Check to see if the resource bundle exists inside the top level bundle NSBundle *resourcesBundle = [NSBundle bundleWithPath:[mainBundle pathForResource:@"IQKeyboardManager" ofType:@"bundle"]]; if (resourcesBundle == nil) { resourcesBundle = mainBundle; } imageLeftArrow = [UIImage imageNamed:@"IQButtonBarArrowLeft" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; imageRightArrow = [UIImage imageNamed:@"IQButtonBarArrowRight" inBundle:resourcesBundle compatibleWithTraitCollection:nil]; } else { imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; } #endif #else //Maximum target iOS 7 UIImage *imageLeftArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowLeft"]; UIImage *imageRightArrow = [UIImage imageNamed:@"IQKeyboardManager.bundle/IQButtonBarArrowRight"]; #endif //Previous button IQBarButtonItem *prev = [[IQBarButtonItem alloc] initWithImage:imageLeftArrow style:UIBarButtonItemStylePlain target:target action:previousAction]; [items addObject:prev]; //Fixed space IQBarButtonItem *fixed =[[IQBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil]; [fixed setWidth:20]; [items addObject:fixed]; //Next button IQBarButtonItem *next = [[IQBarButtonItem alloc] initWithImage:imageRightArrow style:UIBarButtonItemStylePlain target:target action:nextAction]; [items addObject:next]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Title button IQTitleBarButtonItem *title = [[IQTitleBarButtonItem alloc] initWithTitle:self.shouldHideTitle?nil:titleText]; [items addObject:title]; //Flexible space [items addObject:[[self class] flexibleBarButtonItem]]; //Right button IQBarButtonItem *doneButton =[[IQBarButtonItem alloc] initWithTitle:rightButtonTitle style:UIBarButtonItemStyleDone target:target action:rightButtonAction]; [items addObject:doneButton]; // Adding button to toolBar. [toolbar setItems:items]; // Setting toolbar to keyboard. [(UITextField*)self setInputAccessoryView:toolbar]; } - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction shouldShowPlaceholder:(BOOL)showPlaceholder { NSString *title; if (showPlaceholder && [self respondsToSelector:@selector(placeholder)]) title = [(UITextField*)self placeholder]; [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:title]; } - (void)addPreviousNextRightOnKeyboardWithTarget:(id)target rightButtonTitle:(NSString*)rightButtonTitle previousAction:(SEL)previousAction nextAction:(SEL)nextAction rightButtonAction:(SEL)rightButtonAction { [self addPreviousNextRightOnKeyboardWithTarget:target rightButtonTitle:rightButtonTitle previousAction:previousAction nextAction:nextAction rightButtonAction:rightButtonAction titleText:nil]; } -(void)setEnablePrevious:(BOOL)isPreviousEnabled next:(BOOL)isNextEnabled { // Getting inputAccessoryView. IQToolbar *inputAccessoryView = (IQToolbar*)[self inputAccessoryView]; // If it is IQToolbar and it's items are greater than zero. if ([inputAccessoryView isKindOfClass:[IQToolbar class]] && [[inputAccessoryView items] count]>0) { if ([[inputAccessoryView items] count]>3) { // Getting first item from inputAccessoryView. IQBarButtonItem *prevButton = (IQBarButtonItem*)[[inputAccessoryView items] objectAtIndex:0]; IQBarButtonItem *nextButton = (IQBarButtonItem*)[[inputAccessoryView items] objectAtIndex:2]; // If it is UIBarButtonItem and it's customView is not nil. if ([prevButton isKindOfClass:[IQBarButtonItem class]] && [nextButton isKindOfClass:[IQBarButtonItem class]]) { if (prevButton.enabled != isPreviousEnabled) [prevButton setEnabled:isPreviousEnabled]; if (nextButton.enabled != isNextEnabled) [nextButton setEnabled:isNextEnabled]; } } } } @end Pods/IQKeyboardManager/IQKeyBoardManager/KeyboardManager.h
New file @@ -0,0 +1,39 @@ // // KeyboardManager.h // https://github.com/hackiftekhar/IQKeyboardManager // Copyright (c) 2013-15 Iftekhar Qurashi. // // 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. #ifndef KeyboardManager_h #define KeyboardManager_h #import "IQBarButtonItem.h" #import "IQKeyboardManager.h" #import "IQKeyboardManagerConstants.h" #import "IQKeyboardReturnKeyHandler.h" #import "IQTextView.h" #import "IQTitleBarButtonItem.h" #import "IQToolbar.h" #import "IQUIView+Hierarchy.h" #import "IQUIView+IQKeyboardToolbar.h" #import "IQUIWindow+Hierarchy.h" #endif Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@2x.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowLeft@3x.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@2x.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/IQButtonBarArrowRight@3x.png
Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/de.lproj/IQKeyboardManager.strings
New file @@ -0,0 +1,13 @@ "enabled" = "aktiviert"; "disabled" = "deaktiviert"; "already disabled" = "bereits deaktiviert"; "already enabled" = "bereits aktiviert"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "Sie müssen im AppDelegate UIWindow.rootViewController setzen um mit IQKeyboardManager zu arbeiten"; "Previous" = "Zurück"; "Next" = "Vor"; Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/en.lproj/IQKeyboardManager.strings
New file @@ -0,0 +1,13 @@ "enabled" = "enabled"; "disabled" = "disabled"; "already disabled" = "already disabled"; "already enabled" = "already enabled"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager"; "Previous" = "Previous"; "Next" = "Next"; Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/es.lproj/IQKeyboardManager.strings
New file @@ -0,0 +1,14 @@ "enabled" = "activado"; "disabled" = "desactivado"; "already disabled" = "ya está desactivado"; "already enabled" = "ya está activado"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "Debe establecer UIWindow.rootViewController en su AppDelegate para trabajar con IQKeyboardManager"; "Previous" = "Anterior"; "Next" = "Siguiente"; Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/fr.lproj/IQKeyboardManager.strings
New file @@ -0,0 +1,13 @@ "enabled" = "activé"; "disabled" = "désactivé"; "already disabled" = "déjà désactivé"; "already enabled" = "déjà activé"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "Vous devez définir UIWindow.rootViewController dans votre AppDelegate pour IQKeyboardManager fonctionne"; "Previous" = "Précédent"; "Next" = "Suivant"; Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/zh-Hans/IQKeyboardManager.strings
New file @@ -0,0 +1,13 @@ "enabled" = "开启"; "disabled" = "关闭"; "already disabled" = "已经开启"; "already enabled" = "已经关闭"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "为了使用IQKeyboardManager,必须在你的 AppDelegate 中设置 UIWindow.rootViewController。"; "Previous" = "前一个"; "Next" = "下一个"; Pods/IQKeyboardManager/IQKeyBoardManager/Resources/IQKeyboardManager.bundle/zh-Hant/IQKeyboardManager.strings
New file @@ -0,0 +1,13 @@ "enabled" = "開啟"; "disabled" = "關閉"; "already disabled" = "已經開啟"; "already enabled" = "已經關閉"; "You must set UIWindow.rootViewController in your AppDelegate to work with IQKeyboardManager" = "為了使用IQKeyboardManager,必須在妳的 AppDelegate 中設置 UIWindow.rootViewController。"; "Previous" = "前一個"; "Next" = "下一個"; Pods/IQKeyboardManager/LICENSE.md
New file @@ -0,0 +1,24 @@ IQKeyboardManager license ========================= The MIT License (MIT) Copyright (c) 2013-14 Iftekhar Qurashi 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. Pods/IQKeyboardManager/README.md
New file @@ -0,0 +1,499 @@ <p align="center"> <img src="https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Demo/Resources/icon.png" alt="Icon"/> </p> <H1 align="center">IQKeyboardManager</H1> <p align="center"> <img src="https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg" alt="GitHub license"/> [](https://travis-ci.org/hackiftekhar/IQKeyboardManager) [](https://coveralls.io/r/hackiftekhar/IQKeyboardManager?branch=master) [](https://landscape.io/github/hackiftekhar/IQKeyboardManager/master) 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 [](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager) [](http://issuestats.com/github/hackiftekhar/iqkeyboardmanager) 1) `**CODELESS**, Zero Line Of Code` 2) `Works Automatically` 3) `No More UIScrollView` 4) `No More Subclasses` 5) `No More Manual Work` 6) `No More #imports` `IQKeyboardManager` works on all orientations, and with the toolbar. There are also nice optional features allowing you to customize the distance from the text field, add the next/previous done button as a keyboard UIToolbar, play sounds when the user navigations through the form and more. ## Screenshot [](http://youtu.be/6nhLw6hju2A) [](http://youtu.be/6nhLw6hju2A) ## GIF animation [](http://youtu.be/6nhLw6hju2A) ## Video <a href="http://youtu.be/WAYc2Qj-OQg" target="_blank"><img src="http://img.youtube.com/vi/WAYc2Qj-OQg/0.jpg" alt="IQKeyboardManager Demo Video" width="480" height="360" border="10" /></a> ## 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 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 []() #### IQKeyboardManager:- [](https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/Introduction/Introduction.html) Minimum iOS Target: iOS 7.0 Minimum Xcode Version: Xcode 5.1.1 #### IQKeyboardManagerSwift:- [](https://developer.apple.com/swift) Minimum iOS Target: iOS 7.0 Minimum Xcode Version: Xcode 7 #### Demo Project:- Minimum Xcode Version: Xcode 7 Installation ========================== #### Cocoapod Method:- [](http://cocoadocs.org/docsets/IQKeyboardManager) **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'` ***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.1 (Xcode 7.1)* `pod 'IQKeyboardManagerSwift'` *Or* `pod 'IQKeyboardManagerSwift', '3.3.4'` *Swift 2.0 (Xcode 7.0)* `pod 'IQKeyboardManagerSwift', '3.3.3.1'` *Swift 1.2 (Xcode 6.4)* `pod 'IQKeyboardManagerSwift', '3.3.1'` In AppDelegate.swift, just import IQKeyboardManagerSwift framework and enable IQKeyboardManager. ``` import IQKeyboardManagerSwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { IQKeyboardManager.sharedManager().enable = true return true } } ``` #### Source Code Method:- []() ***IQKeyboardManager (Objective-C):-*** Just ***drag and drop*** `IQKeyBoardManager` directory from demo project to your project. That's it. ***IQKeyboardManager (Swift):-*** ***Drag and drop*** `IQKeyBoardManagerSwift` directory from demo project to your project In AppDelegate.swift, just enable IQKeyboardManager. ``` @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { IQKeyboardManager.sharedManager().enable = true return true } } ``` ## Known Issues:-  ####1) Keyboard does not appear in iOS Simulator ([#62](https://github.com/hackiftekhar/IQKeyboardManager/issues/62), [#72](https://github.com/hackiftekhar/IQKeyboardManager/issues/72), [#75](https://github.com/hackiftekhar/IQKeyboardManager/issues/75), [#90](https://github.com/hackiftekhar/IQKeyboardManager/issues/90), [#100](https://github.com/hackiftekhar/IQKeyboardManager/issues/100)) If keyboard does not appear in iOS Simulator and only toolbar is appearing over it (if enableAutoToolbar = YES), then check this setting ***Xcode 6:-*** Goto ***iOS Simulator->Menu->Hardware->Keyboard->Connect Hardware Keyboard***, and deselect that. ***Xcode 5 and earlier:-*** Goto ***iOS Simulator->Menu->Hardware->Simulate Hardware Keyboard***, and deselect that. ####2) setEnable = NO doesn't disable automatic UIToolbar ([#117](https://github.com/hackiftekhar/IQKeyboardManager/issues/117), [#136](https://github.com/hackiftekhar/IQKeyboardManager/issues/136), [#147](https://github.com/hackiftekhar/IQKeyboardManager/issues/147)) If you set ***[[IQKeyboardManager sharedManager] setEnable:NO]*** and still automatic toolbar appears on textFields? Probably you haven't heard about ***@property enableAutoToolbar***. ***@property enable :*** It enable/disable managing distance between keyboard and textField, and doesn't affect autoToolbar feature. ***@property enableAutoToolbar :*** It enable/disable automatic creation of toolbar, please set enableAutoToolbar to NO if you don't want to add automatic toolbar. ####3) Not working when pinning textfield from TopLayoutguide ([#124](https://github.com/hackiftekhar/IQKeyboardManager/issues/124), [#137](https://github.com/hackiftekhar/IQKeyboardManager/issues/137), [#160](https://github.com/hackiftekhar/IQKeyboardManager/issues/160), [#206](https://github.com/hackiftekhar/IQKeyboardManager/issues/206)) Now IQKeyboardManager can work with topLayoutConstraint and bottomLayoutConstraint with a bit of manual management. Please check below ***Manual Management->Working with TopLayoutGuide and BottomLayoutGuide*** section. ####4) Toolbar becomes black while popping from a view controller ([#374](https://github.com/hackiftekhar/IQKeyboardManager/issues/374)) This issue happens when there is a textField active on a view controller and you navigate to another view controller without resigning currently active textField. This is an iOS issue and happens even if you don't integrate library.  For a workaround, you can resign currently active textField in `viewWillDisappear` method. ``` -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.view endEditing:YES]; } ``` ## Known Issues (Swift):- ####1) Manually enable IQKeyboardManager Swift Version. From Swift 1.2, compiler no longer allows to override `class func load()` method, so you need to manually enable IQKeyboardManager using below line of code in AppDelegate. ``` IQKeyboardManager.sharedManager().enable = true ``` Manual Management:- --- #### UINavigationBar:- If you don't want to hide the default UINavigationBar of UINavigationController when keyboardManager slides up the view, then just change the UIView class to UIScrollView from the storyboard or xib.([#21](https://github.com/hackiftekhar/IQKeyboardManager/issues/21), [#24](https://github.com/hackiftekhar/IQKeyboardManager/issues/24))  If you are not using storyboard or xib and creating your view programmatically. Then you need to override '-(void)loadView' method of UIViewController, and need to set an UIScrollView instance to self.view. -(void)loadView { UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; self.view = scrollView; } #### Working with TopLayoutGuide and BottomLayoutGuide:- Technically IQKeyboardManager moves upwards/downwards of currently presentedViewController's view. So if you're pinning your UITextfield/UITextView with TopLayoutGuide/BottomLayoutGuide then you're saying **Keep x distance from screen top(I don't care about where is self.view)**'. In this case your view is moved upwards but textField remains at same position and keeping x distance from screen top. To fix it, just let IQKeyboardManager know the constraint which is pinned with **TopLayoutGuide/BottomLayoutGuide**, just map **TopLayoutGuide/BottomLayoutGuide** constraint with **IQLayoutGuideConstraint**. Here is the screenshot:-  If your textFields are inside any UIView and your UIView is pinned with **TopLayoutGuide/BotomLayoutGuide** then also you can map **TopLayoutGuide/BottomLayoutGuide** constraint with **IQLayoutGuideConstraint**. here are the screenshots:-   #### Disable for a ViewController:- If you would like to disable `IQKeyboardManager` for a particular ViewController then register ViewController with `-(void)disableInViewControllerClass:(Class)disabledClass` method in AppDelegate.([#117](https://github.com/hackiftekhar/IQKeyboardManager/issues/117),[#139](https://github.com/hackiftekhar/IQKeyboardManager/issues/139)) ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[IQKeyboardManager sharedManager] disableInViewControllerClass:[ViewController class]]; return YES; } ``` #### Disable toolbar for a ViewController:- If you would like to disable `Auto Toolbar` for a particular ViewController then register ViewController with `-(void)disableToolbarInViewControllerClass:(Class)disabledClass` method in AppDelegate. ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[IQKeyboardManager sharedManager] disableToolbarInViewControllerClass:[ViewController class]]; return YES; } ``` #### Considering Previous/Next buttons for textField inside customViews:- If your textFields are on different customView and do not show previous/next to navigate between textField. Then you should create a SpecialView subclass of UIView, then put all customView inside SpecialView, then register SpecialView class using `-(void)considerToolbarPreviousNextInViewClass:(Class)toolbarPreviousNextConsideredClass` method in AppDelegate.([#154](https://github.com/hackiftekhar/IQKeyboardManager/issues/154), [#179](https://github.com/hackiftekhar/IQKeyboardManager/issues/179)) ``` - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[IQKeyboardManager sharedManager] considerToolbarPreviousNextInViewClass:[SpecialView class]]; return YES; } ``` #### Keyboard Return Key Handling:- If you would like to implement keyboard **Return Key** as **Next/Done** button, then you can use **IQKeyboardReturnKeyHandler**.([#38](https://github.com/hackiftekhar/IQKeyboardManager/issues/38), [#63](https://github.com/hackiftekhar/IQKeyboardManager/issues/63)) 1) Create an instance variable of `IQKeyboardReturnKeyHandler` and instantiate it in `viewDidLoad` with ViewController object like this:- ``` @implementation ViewController { IQKeyboardReturnKeyHandler *returnKeyHandler; } - (void)viewDidLoad { [super viewDidLoad]; returnKeyHandler = [[IQKeyboardReturnKeyHandler alloc] initWithViewController:self]; } ``` It assign all the responderView delegates to self, and change keybord Return Key to Next key. 2) set instance variable to nil in `dealloc` method. ``` -(void)dealloc { returnKeyHandler = nil; } ``` #### UIToolbar(IQToolbar):- 1) If you don't want to add automatic toolbar over keyboard for a specific textField then you should add a UIView as it's toolbar like this:-([#89](https://github.com/hackiftekhar/IQKeyboardManager/issues/89)) ``` textField.inputAccessoryView = [[UIView alloc] init]; ``` 2) If you need your own control over the previous/next/done button then you should use the UIView category methods to add toolbar over your textField. The UIView category methods are defined in `IQUIView+IQKeyboardToolbar.h` file. You can use them like this:-([#40](https://github.com/hackiftekhar/IQKeyboardManager/issues/40)) ``` -(void)viewDidLoad { [super viewDidLoad]; //Adding done button for textField1 [textField1 addDoneOnKeyboardWithTarget:self action:@selector(doneAction:)]; //Adding previous/next/done button for textField2 [textField2 addPreviousNextDoneOnKeyboardWithTarget:self previousAction:@selector(previousAction:) nextAction:@selector(nextAction:) doneAction:@selector(doneAction:)]; //Adding cancel/done button for textField3 [textField3 addCancelDoneOnKeyboardWithTarget:self cancelAction:@selector(cancelAction:) doneAction:@selector(doneAction:)]; } /*! previousAction. */ -(void)previousAction:(id)button { //previousAction } /*! nextAction. */ -(void)nextAction:(id)button { //nextAction } /*! doneAction. */ -(void)doneAction:(UIBarButtonItem*)barButton { //doneAction } /*! cancelAction. */ -(void)cancelAction:(UIBarButtonItem*)barButton { //cancelAction } ``` #### Doing custom work on textField with returning NO in `textFieldShouldBeginEditing:` delegate:- Generally if developer need to perform some custom task on a particular textField click, then usually developer write their custom code inside ***textFieldShouldBeginEditing:*** and returning NO for that textField. But if you are using IQKeyboardManager, then IQKeyboardManager also asks textField to recognize it can become first responder or not using ***canBecomeFirstResponder*** in `IQUIView+Hierarchy` category, and textField asks it's delegate to respond from `textFieldShouldBeginEditing:`, so this method is called for each textField everytime when a textField becomeFirstResponder. Unintentionally custom code runs multiple times even when we do not touch the textField to become it as first responder. To overcome this situation please use ***isAskingCanBecomeFirstResponder*** BOOL property to check that the delegate is called by IQKeyboardManager or not. ([#88](https://github.com/hackiftekhar/IQKeyboardManager/issues/88)) 1) You may need to import `IQUIView+Hierarchy` category ``` #import "IQUIView+Hierarchy.h" ``` 2) check for ***isAskingCanBecomeFirstResponder*** in `textFieldShouldBeginEditing:` delegate. ``` -(BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if (textField == customWorkTextField) { if (textField.isAskingCanBecomeFirstResponder == NO) { //Do your work on tapping textField. [[[UIAlertView alloc] initWithTitle:@"IQKeyboardManager" message:@"Do your custom work here" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; } return NO; } else return YES; } ``` ## Control Flow Diagram [](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManagerCFD.jpg) ##Properties and functions usage:- ####UIKeyboard handling ***+(instancetype)sharedManager :*** Returns the default singleton instance. ***@property BOOL enable :*** Use this to enable/disable managing distance between keyboard & textField/textView). ***@property CGFloat keyboardDistanceFromTextField :*** Set Distance between keyboard & textField. Can't be less than zero. Default is 10. ***@property BOOL preventShowingBottomBlankSpace :*** Prevent to show bottom blanck area when keyboard slide up the view. Default is YES. ([#93](https://github.com/hackiftekhar/IQKeyboardManager/issues/93)). ####IQToolbar handling ***@property BOOL enableAutoToolbar :*** Enable autoToolbar behaviour. If It is set to NO. You have to manually create UIToolbar for keyboard. Default is YES. ***@property IQAutoToolbarManageBehaviour toolbarManageBehaviour :*** Setting toolbar behaviour to IQAutoToolbarBySubviews to manage previous/next according to UITextField's hierarchy in it's SuperView. Set it to IQAutoToolbarByTag to manage previous/next according to UITextField's tag property in increasing order. Default is IQAutoToolbarBySubviews. ***@property BOOL shouldToolbarUsesTextFieldTintColor :*** If YES, then uses textField's tintColor property for IQToolbar, otherwise tintColor is black. Default is NO. ([#27](https://github.com/hackiftekhar/IQKeyboardManager/issues/27)) ***@property BOOL shouldShowTextFieldPlaceholder :*** If YES, then it add the textField's placeholder text on IQToolbar. Default is YES. ([#27](https://github.com/hackiftekhar/IQKeyboardManager/issues/27)) ***@property UIFont *placeholderFont :*** placeholder Font. Default is nil. ([#27](https://github.com/hackiftekhar/IQKeyboardManager/issues/27)) ####UITextView handling ***@property BOOL canAdjustTextView :*** Giving permission to modify TextView's frame. Adjust textView's frame when it is too big in height. Default is NO. ([#30](https://github.com/hackiftekhar/IQKeyboardManager/issues/30)) ***@property BOOL shouldFixTextViewClip :*** Adjust textView's contentInset to fix fix for iOS 7.0.x -([#Stackoverflow](http://stackoverflow.com/questions/18966675/uitextview-in-ios7-clips-the-last-line-of-text-string)). Default is YES. ####UIKeyboard Appearance overriding ***@property BOOL overrideKeyboardAppearance :*** Override the keyboardAppearance for all textField/textView. Default is NO. ***@property UIKeyboardAppearance keyboardAppearance :*** If overrideKeyboardAppearance is YES, then all the textField keyboardAppearance is set using this property. ####UITextField/UITextView Resign handling ***@property BOOL shouldResignOnTouchOutside :*** Resign textField if touched outside of UITextField/UITextView. ([#14](https://github.com/hackiftekhar/IQKeyboardManager/issues/14)) ***-(void)resignFirstResponder :*** Resigns currently first responder field. ####UISound handling ***@property BOOL shouldPlayInputClicks :*** If YES, then it plays inputClick sound on next/previous/done click. Default is NO. ####UIAnimation handling ***@property BOOL shouldAdoptDefaultKeyboardAnimation :*** If YES, then uses keyboard default animation curve style to move view, otherwise uses UIViewAnimationOptionCurveEaseOut animation style. Default is YES. ## Feature:- 1) Support Device Orientation. 2) Enable/Disable Keyboard Manager when needed with `enable` boolean. 3) Easiest integration. 4) AutoHandle UIToolbar as a accessoryInputView of textField/textView with `enableAutoToolbar` boolean. 5) AutoHandle UIToolbar can be manged by superview's hierarchy or can be managed by tag property of textField/textView using `toolbarManageBehaviour` enum. 6) `UIView` Category for easily adding Next/Previous and Done button as Keyboard UIToolBar, even automatic with `enableAutoToolbar` boolean. 7) Enable/Disable Next/Previous buttons with Category methods, even automatic with `enableAutoToolbar` boolean. 8) Set keyboard distance from textFields using `keyboardDistanceFromTextField`. 9) Resign keyboard on touching outside using `shouldResignOnTouchOutside`. 10) Manage UITextView's frame when it's hight is too large to fit on screen with `canAdjustTextView` boolean. 11) Can manage `UITextField/UITextView` inside `UITableView/UIScrollView`. 12) Can play input sound on Next/Previous/Done click. LICENSE --- Distributed under the MIT License. Contributions --- Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub. Author --- If you wish to contact me, email at: hack.iftekhar@gmail.com [](https://bitdeli.com/free "Bitdeli Badge") Pods/Manifest.lock
@@ -14,6 +14,7 @@ - AFNetworking/Serialization (3.1.0) - AFNetworking/UIKit (3.1.0): - AFNetworking/NSURLSession - IQKeyboardManager (3.3.7) - SDAutoLayout (2.2.1) - SDWebImage (4.4.0): - SDWebImage/Core (= 4.4.0) @@ -33,6 +34,7 @@ DEPENDENCIES: - AFNetworking (~> 3.0) - IQKeyboardManager - SDAutoLayout - SDWebImage - SVProgressHUD @@ -44,6 +46,7 @@ SPEC REPOS: https://github.com/CocoaPods/Specs.git: - AFNetworking - IQKeyboardManager - SDAutoLayout - SDWebImage - SVProgressHUD @@ -55,6 +58,7 @@ SPEC CHECKSUMS: AFNetworking: 5e0e199f73d8626b11e79750991f5d173d1f8b67 IQKeyboardManager: 249c3946acf61345c18b038eb50863fe2793e3a8 SDAutoLayout: 8bf6b3bbc8b01f775d4defbb4fda2ace805461be SDWebImage: b534502786e43dde36dfcaee89356fe6df30e203 SVProgressHUD: c404a55d78acbeb7ebb78b76d3faf986475a6994 @@ -64,6 +68,6 @@ YYModel: 2a7fdd96aaa4b86a824e26d0c517de8928c04b30 YYWebImage: 5f7f36aee2ae293f016d418c7d6ba05c4863e928 PODFILE CHECKSUM: f1f331d7ce40276e3e5cab6707de67dbda4a3be9 PODFILE CHECKSUM: d781d1544c8f8305855b93dab835453200677052 COCOAPODS: 1.10.1 Pods/Pods.xcodeproj/project.pbxproj
@@ -19,517 +19,603 @@ /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 01686953CD3D80119BE2E79E920E21C0 /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 0AA915DBD189C1B6F2D5B83BB54BDBAF /* SDAutoLayout-dummy.m */; }; 01D7E391E8E95AB0E70DC249E83712DE /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D3217F9594A01CBC4656983FF2479B8 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 03761C0962B52E53B7F8A870B2351A8F /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = D2EDA0DD8D9C69FF292D109065E99595 /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 06E5333A8E413955FD8C11FFECF520AA /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 2BBD0139397CF24AC5849DD27F21FF27 /* UIRefreshControl+AFNetworking.m */; }; 082F001006A4B880FD6DF6A40295DC36 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = B8495BD79505433FCA75DF8E04C6978D /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; 09D03F80892A9C1F559A675D105A51F8 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A5C148E1F02F4DD148BB311E682ACB /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0ACC285E6095C841069B68827972B9B8 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6AD6B595D278CCFF87534AA6EB032EED /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CA80ED7E59E6BCE64CEEE649A3C6D2F /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = 64BAB9AC92FA277FDD35C926DA9BE70D /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CEAF7266024ECF4088E0E202CAFB971 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = F1476DBFA9F5095C630635B7ED3AEC9D /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 01686953CD3D80119BE2E79E920E21C0 /* SDAutoLayout-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */; }; 01D7E391E8E95AB0E70DC249E83712DE /* UIActivityIndicatorView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 03761C0962B52E53B7F8A870B2351A8F /* _YYWebImageSetter.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 03B8B3005759DA608C1306825F209CD3 /* IQKeyboardManager.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */; }; 06E5333A8E413955FD8C11FFECF520AA /* UIRefreshControl+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */; }; 07B5C8E2673AFDE7E93458F8AA3E912B /* IQKeyboardManagerConstantsInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */; settings = {ATTRIBUTES = (Public, ); }; }; 082BCD8FE038428839036EA7081C0667 /* IQUIViewController+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */; }; 082F001006A4B880FD6DF6A40295DC36 /* SDAnimatedImageRep.h in Headers */ = {isa = PBXBuildFile; fileRef = 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */; settings = {ATTRIBUTES = (Public, ); }; }; 09D03F80892A9C1F559A675D105A51F8 /* SDWebImageFrame.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0A6D1212D37F5050068C8826C6DA8CA9 /* IQNSArray+Sort.h in Headers */ = {isa = PBXBuildFile; fileRef = 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0ACC285E6095C841069B68827972B9B8 /* NSImage+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CA80ED7E59E6BCE64CEEE649A3C6D2F /* SVProgressHUD.h in Headers */ = {isa = PBXBuildFile; fileRef = F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0CEAF7266024ECF4088E0E202CAFB971 /* AFNetworkReachabilityManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 0D5FD6CC0D49C8A7C922E477C48145C7 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 0D6752EE0B527FB09ED922FEEB59E55B /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = F80080175678CE343D3AAB9E925DA1BA /* YYAnimatedImageView.m */; }; 0D6752EE0B527FB09ED922FEEB59E55B /* YYAnimatedImageView.m in Sources */ = {isa = PBXBuildFile; fileRef = 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */; }; 106468F1D026BCEF8F0DBD89BFD48494 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 13C27E8ACA307045C3BC4FA129336ED0 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A036F5A865F8074B6C533A9636BA5584 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 13C27E8ACA307045C3BC4FA129336ED0 /* SDWebImageGIFCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 14F89168C65A740ADEDEA99DEE53C70F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; 15A92C516BE7A3A905BD4BBAF40EE6D5 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 6D1ED0920F93C04C1267CB6D1159FCFA /* UIView+WebCacheOperation.m */; }; 160EE4E1E0CF80014D10FB88DE80D199 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B449A3E70F510F20309AEE1F8E7338D6 /* YYDiskCache.m */; }; 1658CD0DF2196FAB71B3DEF95B344318 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 75BFC838A48D059D000B143191621658 /* AFURLRequestSerialization.m */; }; 17080F40C8CDA135222099E3F6326C8B /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E6DD4676503B9A73639A64D61E1EA9C6 /* UIImageView+YYWebImage.m */; }; 196A945D73E49443D09D5470BEB02B0E /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 31C3C0F19E4822B4EE1A9B1EEAAB58D3 /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A1409A5A7F08CFC2962801F1843E2CF /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A191B06F544F9EA0767C1656E60D83D8 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B89EB0CBABE5CB398C0B4BBF7B2B532 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 47EB02A3E16FB12FAA54FE87F6051AE3 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1CCCE95A2F6CEB152455375994D8D16F /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9393AA800AFDC41C6F734BB3A8238193 /* AFNetworking-dummy.m */; }; 1DBA24E15219339B79A8E4F5940D91F8 /* UIImage+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = D23F19B16B57D0A66373E8372683A768 /* UIImage+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 15A92C516BE7A3A905BD4BBAF40EE6D5 /* UIView+WebCacheOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */; }; 160EE4E1E0CF80014D10FB88DE80D199 /* YYDiskCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */; }; 1658CD0DF2196FAB71B3DEF95B344318 /* AFURLRequestSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */; }; 17080F40C8CDA135222099E3F6326C8B /* UIImageView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */; }; 19278CD21FC6C7AA64E72D72103E7527 /* IQUITextFieldView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 196A945D73E49443D09D5470BEB02B0E /* YYImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1A1409A5A7F08CFC2962801F1843E2CF /* SDWebImagePrefetcher.h in Headers */ = {isa = PBXBuildFile; fileRef = A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B4EA8CA1B9069B5CB12C5E26B3D467A /* IQKeyboardManagerConstants.h in Headers */ = {isa = PBXBuildFile; fileRef = 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1B89EB0CBABE5CB398C0B4BBF7B2B532 /* AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1CCCE95A2F6CEB152455375994D8D16F /* AFNetworking-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */; }; 1DBA24E15219339B79A8E4F5940D91F8 /* UIImage+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1DF9E9B0DCFDA6932201D0C9C7466C14 /* IQKeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 1E8258ABACC2A0CA814D58F91E8BF418 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; 1F0100C3D20FA338B398C5F78B1A0365 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F6F65C5FBEB46F6845A207F3F2D5B91 /* UIImage+GIF.m */; }; 1F0100C3D20FA338B398C5F78B1A0365 /* UIImage+GIF.m in Sources */ = {isa = PBXBuildFile; fileRef = 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */; }; 1F0CAFB943FF9A1C978D6FFFAA61ED88 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 1F6A10551E86812B881DD410A45F3DA2 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 219322D73B873BFA5511CB496DA3F8C0 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 22C82F140DCF6E5BA1DA2AA497E203C5 /* YYImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A9716D80F403ADFAEFFFD79F213BEA6B /* YYImage-dummy.m */; }; 23695135D0C88CCC90D310D5E1543580 /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 5ED100A22D528A6B527BF6A89A4AC7D6 /* UIButton+YYWebImage.m */; }; 246BFE7C6CB405B6E1733CBF11A889AC /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 1967B907B97CEDB5AD21AA7500813370 /* YYWebImageManager.m */; }; 249281A863DDBA3E28AA83127A59649A /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 10995FE8BCC6F1F7D28ABAB4883A2C80 /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24CBB9E8B88215A2B5D05AE6D328A9C6 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 171266574FF9DD54AA392259649BE115 /* YYWebImageOperation.m */; }; 25C1ECF2D0D4F5F303EB2DE037BB86B5 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 19816DCC21F8829134E45E9682BB8160 /* UIButton+AFNetworking.m */; }; 260CC600A94EE3ACAEBAEE042882A39F /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 49CDAEC0D81CD6AEF138665058614CEB /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 264E1A478BDFA31DA6842749C72EA535 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 7BB33FD39B6EB78AA6962EADAE8327BE /* SVProgressHUD.bundle */; }; 27FF07CA2721B4A4F2FC51A5904FAFFB /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9278DF4F04872AD2664E2DF7199A12D9 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 282638E9CF2067D5216886757C2213C8 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F9B3215106DC26FDFB291ECB372C9A7 /* AFURLResponseSerialization.m */; }; 2913A801155359C9C62EADE1D9F62694 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = C980A818C139897278AF20D53841C691 /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2CA268B8B38D7FA33D18EBB971B489A1 /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = D1C4E2E999566FCCE98BB31BF78222E5 /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22C82F140DCF6E5BA1DA2AA497E203C5 /* YYImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */; }; 233B5AF506E5E01A5F1795421178189A /* IQUIView+IQKeyboardToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */; }; 23695135D0C88CCC90D310D5E1543580 /* UIButton+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */; }; 246BFE7C6CB405B6E1733CBF11A889AC /* YYWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */; }; 249281A863DDBA3E28AA83127A59649A /* UIButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24CBB9E8B88215A2B5D05AE6D328A9C6 /* YYWebImageOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */; }; 25C1ECF2D0D4F5F303EB2DE037BB86B5 /* UIButton+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */; }; 260CC600A94EE3ACAEBAEE042882A39F /* CALayer+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 264E1A478BDFA31DA6842749C72EA535 /* SVProgressHUD.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */; }; 27FF07CA2721B4A4F2FC51A5904FAFFB /* YYDiskCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 282638E9CF2067D5216886757C2213C8 /* AFURLResponseSerialization.m in Sources */ = {isa = PBXBuildFile; fileRef = BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */; }; 289074B2826B48FD1E713AB6947611F0 /* IQBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2913A801155359C9C62EADE1D9F62694 /* AFHTTPSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 29CBD0C882A38F00F5D32EACDD098B72 /* IQUIScrollView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */; }; 2CA268B8B38D7FA33D18EBB971B489A1 /* YYAnimatedImageView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 2D173375C6C4C3373A225D9D769BE12E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 312293715694D76DFAD273155EB4B413 /* YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = BEA7E182CF4126FE52BF333A77DEC1BE /* YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3392F8407B8C6F47A4E47436894642D8 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 089F1B3B2C32FAACA75AB641A1A2CAB2 /* SVProgressHUD.m */; }; 312293715694D76DFAD273155EB4B413 /* YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3392F8407B8C6F47A4E47436894642D8 /* SVProgressHUD.m in Sources */ = {isa = PBXBuildFile; fileRef = 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */; }; 3534E888D24CF701441C1BE77C3F8571 /* IQKeyboardReturnKeyHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */; }; 36E5A040B5969F53739CAE7CBFD675FB /* IQNSArray+Sort.m in Sources */ = {isa = PBXBuildFile; fileRef = 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */; }; 3736A8BCD00246F0307314AFF8A722F1 /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; 37D20E5E8D97C2E024A584681BE908CD /* YYImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 3A1409D3664D3CAB402EA7CE354AD2D9 /* YYImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 38253CEF04E53A38CCF2E9904F6E5071 /* YYImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C2B02D064FCD002A5F68262C9E0ABF1F /* YYImageCache.m */; }; 3A3E8ECDD4DA8B9C235F539C2BE24C65 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 12DABC1791D35AC91BD3C7424A966245 /* AFURLSessionManager.m */; }; 37D20E5E8D97C2E024A584681BE908CD /* YYImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 38253CEF04E53A38CCF2E9904F6E5071 /* YYImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */; }; 3A3E8ECDD4DA8B9C235F539C2BE24C65 /* AFURLSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */; }; 3AAB542C649A5CD2B56B914AD8823E9C /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AD6E8DFA8A95F045C0E5EACCECE804C /* Security.framework */; }; 3D1DADFAD6A4BA721C0075CA32BDD633 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 7DCD795D6D436433D8513D625C1F4B95 /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D246CE1D817A0EE00F8D8F9DD4BFE26 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4754C7BC29204A1FC3183DC44B138108 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D1DADFAD6A4BA721C0075CA32BDD633 /* AFAutoPurgingImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3D246CE1D817A0EE00F8D8F9DD4BFE26 /* UIRefreshControl+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 3EB3343E3237E27BF431177ADD3A5CBF /* IQUIView+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 40DBC045F76B6E92E5C751110CE9C869 /* IQUIWindow+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */; }; 416BEF9978A1BD50545717CAA92F476A /* IQUIView+Hierarchy.m in Sources */ = {isa = PBXBuildFile; fileRef = 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */; }; 42B47E77D4307132B577801DFDAB4CCD /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */; }; 4381C0C2775DF318539274584275BCB1 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = F8F7BFE3D88FCC88A6C6C2724B3A084A /* NSObject+YYModel.m */; }; 4381C0C2775DF318539274584275BCB1 /* NSObject+YYModel.m in Sources */ = {isa = PBXBuildFile; fileRef = ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */; }; 4762EA920C9F9819455692BA3EE71354 /* IQUIView+IQKeyboardToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; 4915520B56F1D9EE53C133ACE7EBB24E /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; 4B4AD435A9EE19886E4C62760BAD63B8 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = 9A9463816975647F423903B984950F61 /* SDWebImageCompat.m */; }; 4E0B40AA7188E6833F0B9360C5B74D79 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 3BFF6E41A2F0125D92254AD1F6D68BDA /* YYCache.m */; }; 4F7A7E7060578A2E22141D37FCD0E99C /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 2879A2CCE814DAD30804A4B382EEDCCF /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50610569C8916D516CC73F63950CCB84 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 110A1835327E1AAE666E21EDD657ADDD /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; 510E404D41BEC8DF78F85A7DDE7B56E1 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = E1D04B1119AC447A80F102EFF06A6255 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 521AD1329887CB8273DF9131F7333624 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 57F2FF1C08B7D9E885AB50FCC251178D /* SDWebImageCoderHelper.m */; }; 52C0577F44619597C23A6C389EFD9114 /* Pods-BuWanVideo2.0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53053E6349DD9D4D31071F38E392BF59 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 9AA96052761DA3017AFE543C2DBEE398 /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 545A75E3EEACE311E80B97663712095C /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = A71911B340E007EB23030810A80245EC /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 551E99BC10F7CDC9BC88F87F781671E9 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 71B0F349529BA5E42ACE2AAD3502BF81 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 58093D9B7E8597171CBF5CFF90097DE0 /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = B748BAD2A67F8F50CAAFE1FC548C2E8D /* _YYWebImageSetter.m */; }; 4B4AD435A9EE19886E4C62760BAD63B8 /* SDWebImageCompat.m in Sources */ = {isa = PBXBuildFile; fileRef = B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */; }; 4E0B40AA7188E6833F0B9360C5B74D79 /* YYCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */; }; 4F7A7E7060578A2E22141D37FCD0E99C /* UIView+SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; 50610569C8916D516CC73F63950CCB84 /* NSData+ImageContentType.h in Headers */ = {isa = PBXBuildFile; fileRef = 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */; settings = {ATTRIBUTES = (Public, ); }; }; 510E404D41BEC8DF78F85A7DDE7B56E1 /* SDImageCacheConfig.h in Headers */ = {isa = PBXBuildFile; fileRef = 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */; settings = {ATTRIBUTES = (Public, ); }; }; 521AD1329887CB8273DF9131F7333624 /* SDWebImageCoderHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */; }; 53053E6349DD9D4D31071F38E392BF59 /* UIImage+MultiFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */; settings = {ATTRIBUTES = (Public, ); }; }; 545A75E3EEACE311E80B97663712095C /* UIView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 551E99BC10F7CDC9BC88F87F781671E9 /* SDWebImageCodersManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 58093D9B7E8597171CBF5CFF90097DE0 /* _YYWebImageSetter.m in Sources */ = {isa = PBXBuildFile; fileRef = 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */; }; 5A47720AA3478ABCD79FC59654FE66A9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 5AD6365AF464A2FB29405CCBF671449C /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 26892DE9B86C5EBA2A89903D33521679 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5C74C17AB844AC9F6C13EEFED38CF41F /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 992BBEA2CFD95D37FDFFD5D0AEFF2DE9 /* AFNetworkActivityIndicatorManager.m */; }; 5E1A0543905AB8FCAC0402AF11B81281 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = AB539581931047577E5269BBB5770FA8 /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6218AABA7D60EEE58F24657D65595CC1 /* YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = A926B1EBDA47D27718FEF94DA4943176 /* YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65332E624BEBAC6BED2932B7A9B70F7E /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 1E39C0AD688217E83A70EFDD62EA1E63 /* SDWebImageFrame.m */; }; 67E7CC98657717872D159DA4F0AC3110 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 0D4B63FD25AF4B5C2BCC76CAC652FB39 /* NSButton+WebCache.m */; }; 5AD6365AF464A2FB29405CCBF671449C /* AFURLRequestSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5C2234296AADE84E794617E7D34E67F6 /* IQBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */; }; 5C74C17AB844AC9F6C13EEFED38CF41F /* AFNetworkActivityIndicatorManager.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */; }; 5D472E3F0DD3276633EE91E830A0D29F /* IQKeyboardReturnKeyHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */; settings = {ATTRIBUTES = (Public, ); }; }; 5E1A0543905AB8FCAC0402AF11B81281 /* SDWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 614AD41B1BBFF1692CCCDA43B44C31AB /* IQUIViewController+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6218AABA7D60EEE58F24657D65595CC1 /* YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65221D8847419CEC03519C8FA5624619 /* KeyboardManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 65332E624BEBAC6BED2932B7A9B70F7E /* SDWebImageFrame.m in Sources */ = {isa = PBXBuildFile; fileRef = 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */; }; 6657CC5A77D6A6A366F5BA87241BC7B9 /* Pods-BuWanVideo2.0-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6782FD484DE28206A848E06EDCE055D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */; }; 67E7CC98657717872D159DA4F0AC3110 /* NSButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */; }; 6A06F5531F501AD4F245B9832B685C38 /* IQUIScrollView+Additions.h in Headers */ = {isa = PBXBuildFile; fileRef = 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6B2382229D769F71D1BAB712CB085E93 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA9BD546B398156542593B6FD8FA13D6 /* SystemConfiguration.framework */; }; 6B9DE8A420537AC967C0A87E43FDF3A6 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = ADAFC761A5988605B4DA5DD3B4EE8536 /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CA3ADBF9BE822A05AD91650CECE05C8 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = F9D18BA94759BAFE5F10CB799004577D /* UIImageView+WebCache.m */; }; 6E118A825C37D28DEBA12D4CC43621DA /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 705A0D7C97FACC4E5EC237F4890864AC /* YYKVStorage.m */; }; 6F6C6AA412D71F441DECD84528B6ED55 /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 6FF52E3498C63283AC2D3B581BAC2018 /* YYImageCoder.m */; }; 6F6F3576CC9FA481EFA3723EFF19BE10 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 54424E5D9F3331BC557D2BDDCA8BF965 /* SDWebImagePrefetcher.m */; }; 70BE02AB7D87BA952406D342473E52BE /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = 55352ECD5DB2EC5926EEEF8B1FDF9198 /* SDImageCacheConfig.m */; }; 6B9DE8A420537AC967C0A87E43FDF3A6 /* YYKVStorage.h in Headers */ = {isa = PBXBuildFile; fileRef = 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 6CA3ADBF9BE822A05AD91650CECE05C8 /* UIImageView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */; }; 6E118A825C37D28DEBA12D4CC43621DA /* YYKVStorage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */; }; 6F6C6AA412D71F441DECD84528B6ED55 /* YYImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */; }; 6F6F3576CC9FA481EFA3723EFF19BE10 /* SDWebImagePrefetcher.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */; }; 70BE02AB7D87BA952406D342473E52BE /* SDImageCacheConfig.m in Sources */ = {isa = PBXBuildFile; fileRef = DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */; }; 711D0CCAD93057E832D238B2BC5A6033 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; 720ECE6897B4E06BCB36CFF15CDE4086 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 616BBBA9C9A62F8A84D0501DF8C6E340 /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 74DCBC98B76908869FD23A65B6645252 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = 1B9D7CEE7A93D816F6B27CEEF66AADD4 /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7693ED98971103A809300586EB4096F4 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 97B4E305A01EE1D93F4AFD5EB979439C /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7709A6A2F8BDA356D0418B89A01B4D31 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E805DD22ED45B6F62E769AB27215358 /* UIProgressView+AFNetworking.m */; }; 781F3526AF90F13DAEDAD4253E29D082 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 83596981192A82848FACA789662D9901 /* SDImageCache.m */; }; 79277E06065625F5473ED7D0626C3A68 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 403EF6FF8AED7CA0E7D15809052F590D /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 79FD7C8EFDB479D2EB1BF9B2E0B24DD0 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B537F8B7DF7062DDECA3AC23EC1D207 /* SDWebImageDownloaderOperation.m */; }; 7CFC9AFD1D190791F910F4A5A2BAB553 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6BB32E9ECFF5DD428B79BC775270C01B /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D496B6EF9D73C90F8DAE3FC6CA071FE /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A212A5DED1C6C2583A325804040876B /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E6E6846E6395A179A7C0755F565712F /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = FA578C3DD6985D46AC7D739BDDAD1C16 /* YYMemoryCache.m */; }; 7EC8E8BC904C8DEEA88BBA95A154667E /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = C7655860107BCDC2897D49C3E995BA22 /* UIView+WebCache.m */; }; 720ECE6897B4E06BCB36CFF15CDE4086 /* UIButton+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 73D83703524EE58AEEBA1052C720671E /* IQUIWindow+Hierarchy.h in Headers */ = {isa = PBXBuildFile; fileRef = 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */; settings = {ATTRIBUTES = (Public, ); }; }; 74DCBC98B76908869FD23A65B6645252 /* UITableView+SDAutoTableViewCellHeight.h in Headers */ = {isa = PBXBuildFile; fileRef = 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7693ED98971103A809300586EB4096F4 /* AFURLSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7709A6A2F8BDA356D0418B89A01B4D31 /* UIProgressView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */; }; 781F3526AF90F13DAEDAD4253E29D082 /* SDImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */; }; 79277E06065625F5473ED7D0626C3A68 /* SDWebImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; 79FD7C8EFDB479D2EB1BF9B2E0B24DD0 /* SDWebImageDownloaderOperation.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */; }; 7CFC9AFD1D190791F910F4A5A2BAB553 /* UIImageView+HighlightedWebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7D496B6EF9D73C90F8DAE3FC6CA071FE /* AFURLResponseSerialization.h in Headers */ = {isa = PBXBuildFile; fileRef = DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */; settings = {ATTRIBUTES = (Public, ); }; }; 7E6E6846E6395A179A7C0755F565712F /* YYMemoryCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */; }; 7EC8E8BC904C8DEEA88BBA95A154667E /* UIView+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */; }; 7EDD1704F7BA5A5F0205E0723E4FC971 /* IQKeyboardManager-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */; }; 7F52BD0341E46A6053B15014557ACB6A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 824587F89090ED9CC9033F61A77724B9 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 824870F519CB0826C1156BA0B1EBD2F2 /* SDAutoLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 805B652EBBA7C6765EB1F278425EAC8C /* SDAutoLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84084D48DF90D4854965E8D87E848C1A /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = B75FA39EDA8A66E554F9ACACA911A521 /* AFSecurityPolicy.m */; }; 85EF941A4BDD8092002F420CC2BB7ADD /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = FFB783FBACD8D09E969B3233959D2D0E /* UIActivityIndicatorView+AFNetworking.m */; }; 824870F519CB0826C1156BA0B1EBD2F2 /* SDAutoLayout-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 84084D48DF90D4854965E8D87E848C1A /* AFSecurityPolicy.m in Sources */ = {isa = PBXBuildFile; fileRef = 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */; }; 85EF941A4BDD8092002F420CC2BB7ADD /* UIActivityIndicatorView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */; }; 8729F89654316F693E74C3C079897D6D /* IQUITextFieldView+Additions.m in Sources */ = {isa = PBXBuildFile; fileRef = 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */; }; 88DE9AE01F97FD29E9D8793174A5BF14 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 8B71AC80C50029397575DAEA33DAEAE9 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 9CE294E8F0E5A8A5B23DCF1CEE6CD7D6 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = CEEAEC1C6300B4039E15D459577F4ADD /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BF86037EDF057C8E6D6C9DFFDDA36A3 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 9122F074E71E32095F4BA2C2BB54766F /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8C43B7D0D3865D9A9C4D49EF82334CE3 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 83DEE7CF6B8BB33E1CDD7AF83B5E5A22 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8D9B945F0AFBC1D1097696AB22F99BCF /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = 3CEB2A242156CCF15F40B59FD917176D /* SDAnimatedImageRep.m */; }; 8DD422F65B364DB9C1EAE655653561A7 /* YYModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = F709D93F04955DB6D32ACE07BA1AAAD7 /* YYModel-dummy.m */; }; 8F70E70E64F899537D38A1F79F8D57B5 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = 90AF2BB7F4CBFCAFFCAE46A3FFB7BBDF /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 905A5BD8B0732532496FAA4BCA58958C /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 031174D1118FDCD3BD377FD2D53D95F2 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8AF811EB2E5208003431E85B00F983DB /* IQTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8B71AC80C50029397575DAEA33DAEAE9 /* UIKit+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E0330675D0150100081993C047FB3D7 /* YYImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8BF86037EDF057C8E6D6C9DFFDDA36A3 /* UIImage+GIF.h in Headers */ = {isa = PBXBuildFile; fileRef = 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8C43B7D0D3865D9A9C4D49EF82334CE3 /* AFNetworkActivityIndicatorManager.h in Headers */ = {isa = PBXBuildFile; fileRef = A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; 8D9B945F0AFBC1D1097696AB22F99BCF /* SDAnimatedImageRep.m in Sources */ = {isa = PBXBuildFile; fileRef = A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */; }; 8DD422F65B364DB9C1EAE655653561A7 /* YYModel-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */; }; 8F70E70E64F899537D38A1F79F8D57B5 /* UIImage+ForceDecode.h in Headers */ = {isa = PBXBuildFile; fileRef = A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */; settings = {ATTRIBUTES = (Public, ); }; }; 905A5BD8B0732532496FAA4BCA58958C /* YYModel-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 91B9A2A4C61C5D595A0F0419A325AC40 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; 928F8138E2582858005CA31B3141CDC3 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */; }; 92C28AA1FA2F8C956842FD8F139FEAB7 /* UIImageView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 985F852E09A6DE92A217698DBE1C7A09 /* UIImageView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 92C28AA1FA2F8C956842FD8F139FEAB7 /* UIImageView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9402C6C6CB65FA5044809FF0975BFE4D /* IQTitleBarButtonItem.m in Sources */ = {isa = PBXBuildFile; fileRef = 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */; }; 94AC2AFF07AFF95D801F947F2ABBD51A /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */; }; 96EADE99073DBA8FCE7904627E2D18EE /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = F9F3F58FCB07AA431128E53E86525582 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 96EADE99073DBA8FCE7904627E2D18EE /* SVIndefiniteAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; 97F1A9CA6BBC0096DF0C1FFC7E66A90F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; 98E7FA15BF438999C6844F3B4C5B7C7F /* IQToolbar.m in Sources */ = {isa = PBXBuildFile; fileRef = 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */; }; 9D0B6C5BE070D0FA1DE9E8F572FECED9 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 54EB9970CE17B7B031A9F665B86288E9 /* CoreGraphics.framework */; }; 9DB574CAF1B65B49E42B66D457AF5714 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = C2CEA0307F8697286A315010110C46F4 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9F5640657DA2CE1775F92DB0AFB96EB1 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 81548F4A58870D59D757ECB8B0F049EE /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9FDEEEE37349769B84A30B0105DFF456 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 245C98C3E82429A997870CDE1743EF72 /* SVProgressHUD-dummy.m */; }; A06586F6C95F5672F87CCE76EC1C03DA /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 9659961AA138D0C1F08083D5FE93160F /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A06F8E2BDB1C1C5627C02E09756BD055 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = BF1FFAD1010C059FD96AD4DBA2DBABE3 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; A0E7562E696BD40E4D86232FFC137CC5 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = EA9826C34F97624CE5824110846935FE /* UIImage+ForceDecode.m */; }; A251155849AEE5C8B8E3F88ADD4DC646 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = D1DA9D6D22497E708E7152EEDCA290B7 /* UIImageView+AFNetworking.m */; }; 9DB574CAF1B65B49E42B66D457AF5714 /* UIImage+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9F5640657DA2CE1775F92DB0AFB96EB1 /* SDWebImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; 9FDEEEE37349769B84A30B0105DFF456 /* SVProgressHUD-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */; }; A06586F6C95F5672F87CCE76EC1C03DA /* UIImageView+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A06F8E2BDB1C1C5627C02E09756BD055 /* YYClassInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; A0E7562E696BD40E4D86232FFC137CC5 /* UIImage+ForceDecode.m in Sources */ = {isa = PBXBuildFile; fileRef = AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */; }; A251155849AEE5C8B8E3F88ADD4DC646 /* UIImageView+AFNetworking.m in Sources */ = {isa = PBXBuildFile; fileRef = 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */; }; A2A59DBCA090BBD47F9995C3F81F12D3 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 00EFF7FD5FFA4E8E08F4DEC390D90258 /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4B26F9C0AD28AC8629E03B084D58153 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 8650119DBDF3E87904B9B930C9397085 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4EEC50B476499D7774479ED700B7CAA /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = 2D5748AC54C2B14A346A0B51EDCA41E8 /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A64AEFFB083BD4CC51E4A1B24120E601 /* YYCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 7AE622C260D00CD5E4191DF952109CE7 /* YYCache-dummy.m */; }; A6E7C58E58AE42E14B07F7F3C45F11D6 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = DC3CAFC5CD677A3FE639DF7530A4ADCA /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A8E9F3FDBA4A379585660CD123974DF7 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B9C0F5AC04DFCC94CB01CA54FDCE85B0 /* SDWebImageCodersManager.m */; }; A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4B26F9C0AD28AC8629E03B084D58153 /* NSButton+WebCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A4EEC50B476499D7774479ED700B7CAA /* SDWebImageImageIOCoder.h in Headers */ = {isa = PBXBuildFile; fileRef = D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */; settings = {ATTRIBUTES = (Public, ); }; }; A64AEFFB083BD4CC51E4A1B24120E601 /* YYCache-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */; }; A6E7C58E58AE42E14B07F7F3C45F11D6 /* SDImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; A8E9F3FDBA4A379585660CD123974DF7 /* SDWebImageCodersManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */; }; A9044F54D6B87D173D3DBC4D37B0322E /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; A993C1145B885A9AEDC6F5B33BC33B2A /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 681CE234389CC9E5EB9B42C756D9F01C /* AFNetworkReachabilityManager.m */; }; A9E6984E363F2582F604864C26AB65D5 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 7116D0BE1A35B813BE766D6D05A0619E /* AFImageDownloader.m */; }; A993C1145B885A9AEDC6F5B33BC33B2A /* AFNetworkReachabilityManager.m in Sources */ = {isa = PBXBuildFile; fileRef = F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */; }; A9E6984E363F2582F604864C26AB65D5 /* AFImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */; }; AF5020295AF52986538B58EBD14CAD22 /* YYImage.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2A7715F1A1B156E616461C07DD63E2E8 /* YYImage.framework */; }; B2064E3412AFB3FA11A067824C3AF9C0 /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 259861383D192B86B4CB86EC83BD6F5B /* YYFrameImage.m */; }; B2064E3412AFB3FA11A067824C3AF9C0 /* YYFrameImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */; }; B3B592DBB39B9BEBAEE741984CA4EDBC /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */; }; B3D5E1407586ECB0691CAB7D494F2EA3 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 7FECEB8272DD645EA9A1A1D7968AF57A /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; B5B9915F785CB47C5C07F0B698911B00 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 683B0FC67D3675B040D9DFE07FBF92CF /* SVIndefiniteAnimatedView.m */; }; B8B70DAB160593E2878AD868EC470C8E /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 37BFCA66214330116C39EFDC1DA629DE /* SDWebImageGIFCoder.m */; }; B9E702E84151F4D198A859C11E942FE8 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = DE03CFC1EAF91C6D650F822D59FC4A84 /* SDWebImageTransition.m */; }; BC2362E084FC2F3D1403F395E43B2AE6 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 9BBD2BADF01405E0910DB86D699636F1 /* SDWebImage-dummy.m */; }; BCAEAD0B6FB7CF3E6B2E299EC211A598 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 33F970A9153D219A47A799C907BDEF0D /* UIImage+MultiFormat.m */; }; BCD5541CA37B64DFDF167614CF9A6307 /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C98B29E8D89A81D1387C37712D41FA2 /* UITableView+SDAutoTableViewCellHeight.m */; }; BEFBB26C2EF5BB115DADF979915C0CFF /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5554C9194C38D558307E5EBF72E3A38B /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; C04504996E623DF9D821C32A69E773A7 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 2282492AB36061E6394F5FA34E237FB7 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; B3D5E1407586ECB0691CAB7D494F2EA3 /* SDWebImageCoderHelper.h in Headers */ = {isa = PBXBuildFile; fileRef = 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */; settings = {ATTRIBUTES = (Public, ); }; }; B5B9915F785CB47C5C07F0B698911B00 /* SVIndefiniteAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */; }; B8B70DAB160593E2878AD868EC470C8E /* SDWebImageGIFCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */; }; B9B3A5780DDF886D16F9A708E03257B9 /* IQKeyboardManager-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; B9E702E84151F4D198A859C11E942FE8 /* SDWebImageTransition.m in Sources */ = {isa = PBXBuildFile; fileRef = EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */; }; BC2362E084FC2F3D1403F395E43B2AE6 /* SDWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */; }; BCAEAD0B6FB7CF3E6B2E299EC211A598 /* UIImage+MultiFormat.m in Sources */ = {isa = PBXBuildFile; fileRef = 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */; }; BCD5541CA37B64DFDF167614CF9A6307 /* UITableView+SDAutoTableViewCellHeight.m in Sources */ = {isa = PBXBuildFile; fileRef = F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */; }; BEFBB26C2EF5BB115DADF979915C0CFF /* AFNetworking-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; C04504996E623DF9D821C32A69E773A7 /* AFSecurityPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */; settings = {ATTRIBUTES = (Public, ); }; }; C089CB3645ED26108475717D8A234F4D /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */; }; C29C1BF86EA5C3DBD7AB893ACF8E2B17 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = AC4CA4EE201E4C152503BD2E5F262390 /* YYClassInfo.m */; }; C3C34A910C2DEE4E35AE27371176DF68 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6003C00DB4CAE6C5469AF4143AA7E4CC /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; C4C923BAAED4E28AD1B097DB7C8545B8 /* YYWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 350687140426E59616D8739F07A87916 /* YYWebImage-dummy.m */; }; C4F280FF927E33AE4B49CCD5A0DEB1B5 /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 82AE28987B77CBBAC357CF3D18FD6380 /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; C29C1BF86EA5C3DBD7AB893ACF8E2B17 /* YYClassInfo.m in Sources */ = {isa = PBXBuildFile; fileRef = 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */; }; C3C34A910C2DEE4E35AE27371176DF68 /* SDWebImageCompat.h in Headers */ = {isa = PBXBuildFile; fileRef = C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */; settings = {ATTRIBUTES = (Public, ); }; }; C4C923BAAED4E28AD1B097DB7C8545B8 /* YYWebImage-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */; }; C4F280FF927E33AE4B49CCD5A0DEB1B5 /* YYCache.h in Headers */ = {isa = PBXBuildFile; fileRef = FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; C50103D2DB3878621E00012B3C0924E8 /* AssetsLibrary.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */; }; C6023210D2C9949BB4F985AB776510D4 /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4998DE9316EBA3312011E258172289F2 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C628BDEF88A00A48741BF1CD14212E22 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 05F52E90CF6AB759A5E8973FB2D0A30C /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C6023210D2C9949BB4F985AB776510D4 /* YYWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C628BDEF88A00A48741BF1CD14212E22 /* MKAnnotationView+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; C693B482FBB1AC59EE45643501FC0501 /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; C7158550434B8AB9E73238AE7C16D5D3 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = BEE119170C3A7B367B14F13E15219D97 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C7E3B8A3173AC2FEADEC3EB0E5ED87C3 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = B006573E4EB85905041B6A138C810266 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9A2A2640C150DDFC404F03217AA0B8C /* YYWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 2E2206CE9EC4AEDEF09AEBFDE2BD8187 /* YYWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; CB704E6C8CC04FDCE402502A995BBCA5 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; CEABDB5B9BB37C6A0625573B58524773 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B4BB1AACAFD47360E043BEA2412916A9 /* NSData+ImageContentType.m */; }; D0AE5B928359BB96D0F44BBD95F8BC56 /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 6909FB2E568F5F37628AC8CAB84196A2 /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D15A139A20C280E5F6CC519DB787D78D /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 6218837B76C1C0389CDCD141C2E03DC6 /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D2246BE5AF9C116D84444CC5C955BC02 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 8D3C03CB040CFEA369343B72C9560623 /* SVRadialGradientLayer.m */; }; D2B67B0AD9D2BB06A45268778DC5CC3F /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 08628DAF9A14BE82A0BE7DE1CCC30CC8 /* UIView+SDAutoLayout.m */; }; C7158550434B8AB9E73238AE7C16D5D3 /* SDWebImageOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; C783DEBC3B894EC0FB1403F5A7B8192B /* IQTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */; }; C7E3B8A3173AC2FEADEC3EB0E5ED87C3 /* UIProgressView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9A2A2640C150DDFC404F03217AA0B8C /* YYWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; CEABDB5B9BB37C6A0625573B58524773 /* NSData+ImageContentType.m in Sources */ = {isa = PBXBuildFile; fileRef = B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */; }; D09EF4AC8FC4676ED0ACA92A7C4D979A /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */; }; D0AE5B928359BB96D0F44BBD95F8BC56 /* YYFrameImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D15A139A20C280E5F6CC519DB787D78D /* UIButton+YYWebImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; D2246BE5AF9C116D84444CC5C955BC02 /* SVRadialGradientLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */; }; D2B67B0AD9D2BB06A45268778DC5CC3F /* UIView+SDAutoLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */; }; D47D82B6AA23A0E873D5D007ACE4FF4C /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; D87B2D5ED73534ACF97CE0A52FA18AE4 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 5F417FCC3AFAEC005C47B6F3AC92B167 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; D95B5D47B59AA2E90271A199F117F338 /* UIImage+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = AD4CD0582C8FDBAB40F29C7202E9CCEC /* UIImage+YYWebImage.m */; }; D9CC0E6B7DBCACFD43A5B12A8538C544 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 4EB1170ADBAD2100B2D9C7EE7A734C60 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; DA40AA8CBB6200B48F32ED61B3D071EA /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = 2498F9DB53639ACECAB5B262C8F72815 /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC48D98AE84238022712CDFA94A0D4FE /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 9C30811C95136D9412C3EF9DF03E3A3B /* AFHTTPSessionManager.m */; }; DD25952BB2317C1796500F490ED3FE03 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 292DF8CF4A4F900FAD09AD3388FEBA16 /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE12057AB8895931A0E9499619C5CFC8 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0E255CBD198818C9FF2B233A9984C320 /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0B877ED736BECF2C97D60013CB18E9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = FAF958AAB2DF960FD4FE53CED99EF2D6 /* SDWebImageDownloader.m */; }; E0186A63060F0EB3676F95CD0ACE0E18 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = 9C1A7AD2C0F605984A579EDB6CF18080 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; E130FD79B8A48ABE549B214AC4658CFB /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 1DFB2015FCB3CBC32E1CD10D31A076DA /* YYImage.m */; }; D87B2D5ED73534ACF97CE0A52FA18AE4 /* SVRadialGradientLayer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */; settings = {ATTRIBUTES = (Public, ); }; }; D95B5D47B59AA2E90271A199F117F338 /* UIImage+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */; }; D9CC0E6B7DBCACFD43A5B12A8538C544 /* SDWebImageDownloaderOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; DA40AA8CBB6200B48F32ED61B3D071EA /* NSObject+YYModel.h in Headers */ = {isa = PBXBuildFile; fileRef = D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */; settings = {ATTRIBUTES = (Public, ); }; }; DC48D98AE84238022712CDFA94A0D4FE /* AFHTTPSessionManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */; }; DD25952BB2317C1796500F490ED3FE03 /* YYWebImageManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */; settings = {ATTRIBUTES = (Public, ); }; }; DE12057AB8895931A0E9499619C5CFC8 /* SVProgressHUD-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; DF0B877ED736BECF2C97D60013CB18E9 /* SDWebImageDownloader.m in Sources */ = {isa = PBXBuildFile; fileRef = 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */; }; E0186A63060F0EB3676F95CD0ACE0E18 /* SVProgressAnimatedView.h in Headers */ = {isa = PBXBuildFile; fileRef = E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */; settings = {ATTRIBUTES = (Public, ); }; }; E05231BD74C57583C638BB5DE2B8DC8E /* IQTitleBarButtonItem.h in Headers */ = {isa = PBXBuildFile; fileRef = 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */; settings = {ATTRIBUTES = (Public, ); }; }; E130FD79B8A48ABE549B214AC4658CFB /* YYImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */; }; E28C2A4D11D0E714F957E6AEF7F92B9F /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */; }; E2F4CD643C7A11E485B97318F82B5DD8 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DC1B3D624AE25D948F208A8D8F97335 /* NSImage+WebCache.m */; }; E3FDE4FEAEDEFB5B4EFC2B3CBD1B67F7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 96B11C6B0777E095949C517DFB9FA790 /* SDWebImageManager.m */; }; E42834A2D935B3CC6EEAADAEB1D2EFFB /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1D15DD5FC594A5F83C51C2B5C5F7059A /* AFAutoPurgingImageCache.m */; }; E563E067FD0D9F24C7508D4D4FF33D90 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 1F6F5DB8F0D6862A5655573A1D4BAFAF /* UIImageView+HighlightedWebCache.m */; }; E2F4CD643C7A11E485B97318F82B5DD8 /* NSImage+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */; }; E3FDE4FEAEDEFB5B4EFC2B3CBD1B67F7 /* SDWebImageManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */; }; E42834A2D935B3CC6EEAADAEB1D2EFFB /* AFAutoPurgingImageCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */; }; E563E067FD0D9F24C7508D4D4FF33D90 /* UIImageView+HighlightedWebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */; }; E78632E3ECB979B8210CD00250025E0A /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */; }; E79543DCC3D74CF6741290811F6417B3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = E9AFCFB91D095698C39819DE34185083 /* YYSpriteSheetImage.m */; }; E81C6D77F417BDB6170862FDB6AAC845 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 6E958BABDCCA42C6600F2E2494B6EDB6 /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; E79543DCC3D74CF6741290811F6417B3 /* YYSpriteSheetImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */; }; E81C6D77F417BDB6170862FDB6AAC845 /* YYMemoryCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */; settings = {ATTRIBUTES = (Public, ); }; }; EA1AC9E0A11A65A3E291F8AB9DA8DC03 /* MobileCoreServices.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */; }; EA7FA0F375F7ECD6EC75D3FB35582CAD /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = BF667BB59056E36D3586F9C14DAC1F40 /* MKAnnotationView+YYWebImage.m */; }; EAB3C3F7710E26690FC2D38E833CE33C /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = 4CF37E0998038CB5F5264EBA627D0586 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; EBEBA6A1D9786158E80F5BF4DBD9CA8F /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 6C3272EAA3C0980C4202A1905CC4E11F /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; ED12CD4EE27C699258CAC0CD29582888 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = 997455D8DC27099C363663C9B9A89A97 /* UIButton+WebCache.m */; }; EEAA1518C49804736C3F40117D064CBE /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = 28CF94482299EF63A147A8656CCDCF80 /* SVProgressAnimatedView.m */; }; EA7FA0F375F7ECD6EC75D3FB35582CAD /* MKAnnotationView+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */; }; EAB3C3F7710E26690FC2D38E833CE33C /* UIImageView+AFNetworking.h in Headers */ = {isa = PBXBuildFile; fileRef = B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */; settings = {ATTRIBUTES = (Public, ); }; }; EB93D649F6CD1CC7AE5C33A7C2DD4A92 /* IQKeyboardManager.m in Sources */ = {isa = PBXBuildFile; fileRef = 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */; }; EBEBA6A1D9786158E80F5BF4DBD9CA8F /* AFImageDownloader.h in Headers */ = {isa = PBXBuildFile; fileRef = 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */; settings = {ATTRIBUTES = (Public, ); }; }; ED12CD4EE27C699258CAC0CD29582888 /* UIButton+WebCache.m in Sources */ = {isa = PBXBuildFile; fileRef = B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */; }; EEAA1518C49804736C3F40117D064CBE /* SVProgressAnimatedView.m in Sources */ = {isa = PBXBuildFile; fileRef = C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */; }; EEB7CC04EE70F442DBC73498F9ECDD56 /* YYCache.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9BC90E4D272CEA5634B637942FBA7CFF /* YYCache.framework */; }; EEF7959B592D4019202C84D82D2A8FE0 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = C5C3B937BA90EC2B875E499C709021BD /* SDWebImageImageIOCoder.m */; }; EFB2C2CB1AB435691E0FF07CFA3B19E1 /* YYCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = CA4ADDA4947596B669704CFDBD18111D /* YYCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F04A2B26084965ADA0330211C8F86CE6 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = FB4E26241C34984861F0AEB98573302B /* SDWebImageCoder.m */; }; F0815FF4F542A8FE9CFD07ECF237E4B6 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = DE13C1B71E09CBA1280D586437C8F5FA /* CALayer+YYWebImage.m */; }; F0C7AC07DCDEA2DFD376F4EF79BC58D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */; }; F16F321A9197112912327EB6055BCF13 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = F632A28CEA762627A6ED8CA069E8419D /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F1AF58FF116C9C0780A8D9FE0F028EFD /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = AC1A4624D3723E99D5F3D4F013D24856 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; F7AE4667F4D56C085FB6F3D0D74F8055 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = E15645E83B82404CE1FE18EA81F72477 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB0822F79D370CD5CF7C51979A0271BE /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = F52BC92DA418D92868352F4C9D911068 /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B478562C51883EA5D1453C50613D115 /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; EEF7959B592D4019202C84D82D2A8FE0 /* SDWebImageImageIOCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */; }; EFB2C2CB1AB435691E0FF07CFA3B19E1 /* YYCache-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F04A2B26084965ADA0330211C8F86CE6 /* SDWebImageCoder.m in Sources */ = {isa = PBXBuildFile; fileRef = 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */; }; F0815FF4F542A8FE9CFD07ECF237E4B6 /* CALayer+YYWebImage.m in Sources */ = {isa = PBXBuildFile; fileRef = 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */; }; F16F321A9197112912327EB6055BCF13 /* SDWebImage-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; F1AF58FF116C9C0780A8D9FE0F028EFD /* SDWebImageTransition.h in Headers */ = {isa = PBXBuildFile; fileRef = 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */; settings = {ATTRIBUTES = (Public, ); }; }; F7AE4667F4D56C085FB6F3D0D74F8055 /* UIView+WebCacheOperation.h in Headers */ = {isa = PBXBuildFile; fileRef = AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */; settings = {ATTRIBUTES = (Public, ); }; }; FB0822F79D370CD5CF7C51979A0271BE /* SDAutoLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */; settings = {ATTRIBUTES = (Public, ); }; }; FBAAC816A95407EFC6F55A20809A121C /* IQToolbar.h in Headers */ = {isa = PBXBuildFile; fileRef = AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */; settings = {ATTRIBUTES = (Public, ); }; }; FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */ = {isa = PBXBuildFile; fileRef = C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */; settings = {ATTRIBUTES = (Public, ); }; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 0652055C329CAAC6BF28F8DC9284F62B /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; 31B1F19A02C9D98B04019FEC450A6DF2 /* PBXContainerItemProxy */ = { 0104E26FD175BEA255C6856FF19FB484 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 0130B3724283586C0E9D2A112D4F2AA1; remoteInfo = AFNetworking; }; 3D77959C7B2E87CDFDE22026460AED43 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; 547CA5DA1C33B6B8C609306B71BD860C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; 689EB0A0DDE3D55A22A3C6C3E1EFE62C /* PBXContainerItemProxy */ = { 15F5EB11DB9B4325A6F80F975F9A85BA /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 3847153A6E5EEFB86565BA840768F429; remoteInfo = SDWebImage; }; 83DD6FE8DD5BAE2099906603BBA1CDC8 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; 9029FDC7BEC59240364049C5BD4F579F /* PBXContainerItemProxy */ = { 195BE46DBF20E99C879F0694E2C05E7C /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 6F6B630FA5213AB083E7CEF1F986FE44; remoteInfo = UMCCommon; }; A8330E6DA3342D0209B46298A8E174E7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 84B44807A12996D487A4A591A481D6A0; remoteInfo = YYModel; }; ABD4F84489C589D667C3DA21C04B226F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 488E8C830C5A5694EE916251B9ADAADA; remoteInfo = YYWebImage; }; ABFA14192D282A22EEC33837203FCE68 /* PBXContainerItemProxy */ = { 39010B3C4CD3E161A5359EC62F062B3F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 1C8D67D8B72D6BA42CCEDB648537A340; remoteInfo = SVProgressHUD; }; E884AADB40CC339F9F7AA63363277864 /* PBXContainerItemProxy */ = { 39E01E082225420D2B27661D102B08AF /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; 54F6CEA4803E4F0979EC311FBCA8B3A1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 03932C47FBFD347205B2F367F78E9B63; remoteInfo = SDAutoLayout; }; 6C1CF5D3986704BF19F9EB59D987C6C0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 84B44807A12996D487A4A591A481D6A0; remoteInfo = YYModel; }; 70722B4466CCEF7C48301488CA06D47E /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 488E8C830C5A5694EE916251B9ADAADA; remoteInfo = YYWebImage; }; 8CF7F27808F8A5A006B38502A5B1B60F /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 822E44240F2922DAB12018A6B649BD19; remoteInfo = YYImage; }; A7164C3D5176976AE6A9386AC65256AB /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; A7725E3D9598E58FD15784801553CCF0 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = CFDAE6EB02F58B9A37CADCF439AE6082; remoteInfo = YYCache; }; AA8F9DC2302FB0FC551F2944853C3486 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = FBA456CB50E371584C11231929A0971E; remoteInfo = IQKeyboardManager; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 00A4A55211202D4D5AF8C6AD149E2C10 /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; }; 00EFF7FD5FFA4E8E08F4DEC390D90258 /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYImage/YYImageCoder.h; sourceTree = "<group>"; }; 031174D1118FDCD3BD377FD2D53D95F2 /* YYModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-umbrella.h"; sourceTree = "<group>"; }; 04B775FBF51628EB7F75C50232B7684B /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; }; 05F52E90CF6AB759A5E8973FB2D0A30C /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = "<group>"; }; 07A5C148E1F02F4DD148BB311E682ACB /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = "<group>"; }; 07D077E1B21B15E749023D615A7878AF /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; }; 08628DAF9A14BE82A0BE7DE1CCC30CC8 /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = "<group>"; }; 087FEBFF0DAAC636E025FF25ECF3569E /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = "<group>"; }; 089F1B3B2C32FAACA75AB641A1A2CAB2 /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; }; 08D2FC51A83809AD0A0B791893315AFA /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = "<group>"; }; 0AA915DBD189C1B6F2D5B83BB54BDBAF /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = "<group>"; }; 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; }; 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYCache/YYDiskCache.m; sourceTree = "<group>"; }; 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; }; 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.release.xcconfig; sourceTree = "<group>"; }; 05432A9AD307A07CDC115D90314C096C /* YYCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYCache-Info.plist"; sourceTree = "<group>"; }; 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.m"; sourceTree = "<group>"; }; 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; }; 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.debug.xcconfig; sourceTree = "<group>"; }; 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = "<group>"; }; 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-umbrella.h"; sourceTree = "<group>"; }; 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; }; 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = "<group>"; }; 0B794B4FBBA19E0D4327C041ADBFD6E1 /* Pods-BuWanVideo2.0-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-BuWanVideo2.0-umbrella.h"; sourceTree = "<group>"; }; 0B854A205AB073BF3636BC961E846FD3 /* SDAutoLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDAutoLayout.modulemap; sourceTree = "<group>"; }; 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYWebImage/YYImageCache.m; sourceTree = "<group>"; }; 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYImage.framework; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 0D4B63FD25AF4B5C2BCC76CAC652FB39 /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = "<group>"; }; 0E255CBD198818C9FF2B233A9984C320 /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; }; 0E962C74A956B6F921350A040E437754 /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; }; 10995FE8BCC6F1F7D28ABAB4883A2C80 /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; }; 110A1835327E1AAE666E21EDD657ADDD /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; }; 0E0330675D0150100081993C047FB3D7 /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYImage/YYImage.h; sourceTree = "<group>"; }; 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.release.xcconfig; sourceTree = "<group>"; }; 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = "<group>"; }; 112C50B27098B24207F78749EB22F2A1 /* Pods-BuWanVideo2.0-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BuWanVideo2.0-Info.plist"; sourceTree = "<group>"; }; 1148079642F8F2244A6A077E1584588E /* YYWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.debug.xcconfig; sourceTree = "<group>"; }; 12DABC1791D35AC91BD3C7424A966245 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = "<group>"; }; 171266574FF9DD54AA392259649BE115 /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYWebImage/YYWebImageOperation.m; sourceTree = "<group>"; }; 1967B907B97CEDB5AD21AA7500813370 /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYWebImage/YYWebImageManager.m; sourceTree = "<group>"; }; 19816DCC21F8829134E45E9682BB8160 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = "<group>"; }; 1B9D7CEE7A93D816F6B27CEEF66AADD4 /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = "<group>"; }; 1CBB711B72EF799935BD1AA34EC82468 /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; }; 1D15DD5FC594A5F83C51C2B5C5F7059A /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = "<group>"; }; 1DFB2015FCB3CBC32E1CD10D31A076DA /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYImage/YYImage.m; sourceTree = "<group>"; }; 1E39C0AD688217E83A70EFDD62EA1E63 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = "<group>"; }; 1F6F5DB8F0D6862A5655573A1D4BAFAF /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; }; 2282492AB36061E6394F5FA34E237FB7 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; }; 2303A20C880100C6FAF5B33AF0086887 /* YYImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYImage-Info.plist"; sourceTree = "<group>"; }; 245C98C3E82429A997870CDE1743EF72 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; }; 2498F9DB53639ACECAB5B262C8F72815 /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYModel/NSObject+YYModel.h"; sourceTree = "<group>"; }; 24FF8FB316DCFEFF7280CD09F6014776 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = "<group>"; }; 259861383D192B86B4CB86EC83BD6F5B /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYImage/YYFrameImage.m; sourceTree = "<group>"; }; 26892DE9B86C5EBA2A89903D33521679 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = "<group>"; }; 26982CDDC1FEE9B94BECD243692C02A0 /* YYCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-prefix.pch"; sourceTree = "<group>"; }; 2879A2CCE814DAD30804A4B382EEDCCF /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = "<group>"; }; 28CF94482299EF63A147A8656CCDCF80 /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; }; 292DF8CF4A4F900FAD09AD3388FEBA16 /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYWebImage/YYWebImageManager.h; sourceTree = "<group>"; }; 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; }; 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.debug.xcconfig; sourceTree = "<group>"; }; 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "MKAnnotationView+YYWebImage.h"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.h"; sourceTree = "<group>"; }; 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYWebImage/Categories/UIButton+YYWebImage.m"; sourceTree = "<group>"; }; 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = "<group>"; }; 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.release.xcconfig; sourceTree = "<group>"; }; 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQToolbar.m; path = IQKeyBoardManager/IQToolbar/IQToolbar.m; sourceTree = "<group>"; }; 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = "<group>"; }; 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageFrame.m; path = SDWebImage/SDWebImageFrame.m; sourceTree = "<group>"; }; 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = "<group>"; }; 18FDA1F0984624BF4FBFFC20F1BD72DF /* YYCache-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-prefix.pch"; sourceTree = "<group>"; }; 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageManager.h; path = YYWebImage/YYWebImageManager.h; sourceTree = "<group>"; }; 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIView+Hierarchy.h"; sourceTree = "<group>"; }; 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; }; 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.debug.xcconfig; sourceTree = "<group>"; }; 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUITextFieldView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.m"; sourceTree = "<group>"; }; 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+HighlightedWebCache.m"; path = "SDWebImage/UIImageView+HighlightedWebCache.m"; sourceTree = "<group>"; }; 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYWebImage/Categories/UIImageView+YYWebImage.m"; sourceTree = "<group>"; }; 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQNSArray+Sort.m"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.m"; sourceTree = "<group>"; }; 2401641EA88D2D3E42D792F6F1C609F5 /* YYCache.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYCache.modulemap; sourceTree = "<group>"; }; 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYModel.h; path = YYModel/YYModel.h; sourceTree = "<group>"; }; 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; }; 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = "<group>"; }; 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIView+IQKeyboardToolbar.h"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.h"; sourceTree = "<group>"; }; 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; }; 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIScrollView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.h"; sourceTree = "<group>"; }; 29D083219E4D6FF63F79B64D1C61D694 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 2A2A055FFA758CF75B49CB7F7D947308 /* YYWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.release.xcconfig; sourceTree = "<group>"; }; 2A7715F1A1B156E616461C07DD63E2E8 /* YYImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2BBD0139397CF24AC5849DD27F21FF27 /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = "<group>"; }; 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = "<group>"; }; 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImage.h; path = YYWebImage/YYWebImage.h; sourceTree = "<group>"; }; 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDAutoLayout.framework; path = SDAutoLayout.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 2D5748AC54C2B14A346A0B51EDCA41E8 /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = "<group>"; }; 2DC1B3D624AE25D948F208A8D8F97335 /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = "<group>"; }; 2E2206CE9EC4AEDEF09AEBFDE2BD8187 /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; }; 2F9B3215106DC26FDFB291ECB372C9A7 /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = "<group>"; }; 31C3C0F19E4822B4EE1A9B1EEAAB58D3 /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYWebImage/YYImageCache.h; sourceTree = "<group>"; }; 33F970A9153D219A47A799C907BDEF0D /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; }; 350687140426E59616D8739F07A87916 /* YYWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYWebImage-dummy.m"; sourceTree = "<group>"; }; 37BFCA66214330116C39EFDC1DA629DE /* SDWebImageGIFCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageGIFCoder.m; path = SDWebImage/SDWebImageGIFCoder.m; sourceTree = "<group>"; }; 3A1409D3664D3CAB402EA7CE354AD2D9 /* YYImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-umbrella.h"; sourceTree = "<group>"; }; 3BFF6E41A2F0125D92254AD1F6D68BDA /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYCache/YYCache.m; sourceTree = "<group>"; }; 3CEB2A242156CCF15F40B59FD917176D /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = "<group>"; }; 3DC07D67AD60A466AA585FE94A23467B /* SDAutoLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDAutoLayout-Info.plist"; sourceTree = "<group>"; }; 3EB9FAAC9AB63E4E32244F5166433043 /* SVProgressHUD.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.debug.xcconfig; sourceTree = "<group>"; }; 403EF6FF8AED7CA0E7D15809052F590D /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; }; 4640C7B6757D959E7A83CEFCA2CB1A40 /* SDWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.release.xcconfig; sourceTree = "<group>"; }; 4754C7BC29204A1FC3183DC44B138108 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = "<group>"; }; 47EB02A3E16FB12FAA54FE87F6051AE3 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = "<group>"; }; 4847C41DA1E4C8B4F0815A835E2A252F /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = "<group>"; }; 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworking.h; path = AFNetworking/AFNetworking.h; sourceTree = "<group>"; }; 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SVProgressHUD-dummy.m"; sourceTree = "<group>"; }; 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; }; 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.release.xcconfig; sourceTree = "<group>"; }; 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCache.h; path = YYWebImage/YYImageCache.h; sourceTree = "<group>"; }; 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = "<group>"; }; 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+MultiFormat.m"; path = "SDWebImage/UIImage+MultiFormat.m"; sourceTree = "<group>"; }; 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressHUD.m; path = SVProgressHUD/SVProgressHUD.m; sourceTree = "<group>"; }; 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYModel/YYClassInfo.m; sourceTree = "<group>"; }; 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = "<group>"; }; 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = "<group>"; }; 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYCache/YYKVStorage.h; sourceTree = "<group>"; }; 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSData+ImageContentType.h"; path = "SDWebImage/NSData+ImageContentType.h"; sourceTree = "<group>"; }; 3EEE4E4687D58E6A3DF38DB2C4333F1F /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; }; 3F23DA8E76BB95245303351117CD4386 /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = "<group>"; }; 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; }; 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstantsInternal.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstantsInternal.h; sourceTree = "<group>"; }; 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; }; 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; }; 431F3B040054806778D2F4C904F42267 /* SVProgressHUD-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SVProgressHUD-Info.plist"; sourceTree = "<group>"; }; 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYWebImage/Categories/CALayer+YYWebImage.h"; sourceTree = "<group>"; }; 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageManager.m; path = YYWebImage/YYWebImageManager.m; sourceTree = "<group>"; }; 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.release.xcconfig; sourceTree = "<group>"; }; 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYCache.framework; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 4998DE9316EBA3312011E258172289F2 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYWebImage/YYWebImageOperation.h; sourceTree = "<group>"; }; 49CDAEC0D81CD6AEF138665058614CEB /* CALayer+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "CALayer+YYWebImage.h"; path = "YYWebImage/Categories/CALayer+YYWebImage.h"; sourceTree = "<group>"; }; 4B478562C51883EA5D1453C50613D115 /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYImage/YYSpriteSheetImage.h; sourceTree = "<group>"; }; 4B537F8B7DF7062DDECA3AC23EC1D207 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; }; 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.debug.xcconfig; sourceTree = "<group>"; }; 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "IQKeyboardManager-dummy.m"; sourceTree = "<group>"; }; 4B79D5FCA8231E9F45A5B31DC173CA1D /* YYImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYImage.modulemap; sourceTree = "<group>"; }; 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; }; 4CC6C0AB282BD3E94691A548FC16D909 /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/ImageIO.framework; sourceTree = DEVELOPER_DIR; }; 4CF37E0998038CB5F5264EBA627D0586 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = "<group>"; }; 4EB1170ADBAD2100B2D9C7EE7A734C60 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; }; 4F6F65C5FBEB46F6845A207F3F2D5B91 /* UIImage+GIF.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+GIF.m"; path = "SDWebImage/UIImage+GIF.m"; sourceTree = "<group>"; }; 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYWebImageOperation.m; path = YYWebImage/YYWebImageOperation.m; sourceTree = "<group>"; }; 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = "<group>"; }; 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloaderOperation.m; path = SDWebImage/SDWebImageDownloaderOperation.m; sourceTree = "<group>"; }; 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = "<group>"; }; 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+AFNetworking.m"; path = "UIKit+AFNetworking/UIButton+AFNetworking.m"; sourceTree = "<group>"; }; 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYWebImage.framework; path = YYWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 502BC2D013649451AC55FE5C2449E662 /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = "<group>"; }; 53C8FBCF65FA1D6C097BFAEF45ABE77D /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; }; 54424E5D9F3331BC557D2BDDCA8BF965 /* SDWebImagePrefetcher.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImagePrefetcher.m; path = SDWebImage/SDWebImagePrefetcher.m; sourceTree = "<group>"; }; 54711DC9D900F4F089F990BB85B13D39 /* SDAutoLayout.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.release.xcconfig; sourceTree = "<group>"; }; 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = "<group>"; }; 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = "<group>"; }; 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIRefreshControl+AFNetworking.m"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.m"; sourceTree = "<group>"; }; 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYWebImage/Categories/UIImageView+YYWebImage.h"; sourceTree = "<group>"; }; 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = "<group>"; }; 54EB9970CE17B7B031A9F665B86288E9 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; }; 55352ECD5DB2EC5926EEEF8B1FDF9198 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = "<group>"; }; 5554C9194C38D558307E5EBF72E3A38B /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; }; 567CDEF40DE8516789372AAB65C5CAA8 /* SDAutoLayout.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDAutoLayout.modulemap; sourceTree = "<group>"; }; 57F2FF1C08B7D9E885AB50FCC251178D /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = "<group>"; }; 5937CF31E9A480DE9C6B03D45B79E84E /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; }; 5E805DD22ED45B6F62E769AB27215358 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = "<group>"; }; 5ED100A22D528A6B527BF6A89A4AC7D6 /* UIButton+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+YYWebImage.m"; path = "YYWebImage/Categories/UIButton+YYWebImage.m"; sourceTree = "<group>"; }; 5F417FCC3AFAEC005C47B6F3AC92B167 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; }; 6003C00DB4CAE6C5469AF4143AA7E4CC /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; }; 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImageOperation.h; path = YYWebImage/YYWebImageOperation.h; sourceTree = "<group>"; }; 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+SDAutoLayout.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.m"; sourceTree = "<group>"; }; 567E673CD6E46A9F7459BA13BABE1B46 /* YYWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYWebImage.modulemap; sourceTree = "<group>"; }; 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSImage+WebCache.m"; path = "SDWebImage/NSImage+WebCache.m"; sourceTree = "<group>"; }; 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYWebImage/Categories/UIButton+YYWebImage.h"; sourceTree = "<group>"; }; 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; }; 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardManager.m; path = IQKeyBoardManager/IQKeyboardManager.m; sourceTree = "<group>"; }; 60BF37AF45E0C1545ADD5E112E15DCA9 /* Pods-BuWanVideo2.0-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-BuWanVideo2.0-acknowledgements.markdown"; sourceTree = "<group>"; }; 616BBBA9C9A62F8A84D0501DF8C6E340 /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = "<group>"; }; 61F4D547AD32462650D9BC3A707E2C8C /* YYCache.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.debug.xcconfig; sourceTree = "<group>"; }; 6218837B76C1C0389CDCD141C2E03DC6 /* UIButton+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+YYWebImage.h"; path = "YYWebImage/Categories/UIButton+YYWebImage.h"; sourceTree = "<group>"; }; 632A8A17A96F96D83527581790503221 /* SDWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDWebImage-Info.plist"; sourceTree = "<group>"; }; 64BAB9AC92FA277FDD35C926DA9BE70D /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; }; 659B5F014CB3717763C3D0991CBA9B65 /* UMCCommon.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.release.xcconfig; sourceTree = "<group>"; }; 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = IQKeyboardManager.bundle; path = IQKeyBoardManager/Resources/IQKeyboardManager.bundle; sourceTree = "<group>"; }; 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVRadialGradientLayer.h; path = SVProgressHUD/SVRadialGradientLayer.h; sourceTree = "<group>"; }; 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = "<group>"; }; 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDWebImage.debug.xcconfig; sourceTree = "<group>"; }; 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; }; 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; }; 65AB5484E0E8AC4C147F82ED8920805C /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; }; 661EA3140C2C4652A54C3A7EC01E8E11 /* YYCache-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYCache-Info.plist"; sourceTree = "<group>"; }; 666273D4CA1CF2D3AA3D85BAB6BCDECC /* SVProgressHUD-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SVProgressHUD-Info.plist"; sourceTree = "<group>"; }; 681CE234389CC9E5EB9B42C756D9F01C /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = "<group>"; }; 683B0FC67D3675B040D9DFE07FBF92CF /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; }; 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.m; sourceTree = "<group>"; }; 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIWindow+Hierarchy.m"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.m"; sourceTree = "<group>"; }; 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYImage/YYAnimatedImageView.m; sourceTree = "<group>"; }; 68C97B73020E67FAC643F473194BCB9A /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 6909FB2E568F5F37628AC8CAB84196A2 /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYImage/YYFrameImage.h; sourceTree = "<group>"; }; 6A212A5DED1C6C2583A325804040876B /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; }; 6AD6B595D278CCFF87534AA6EB032EED /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = "<group>"; }; 6BB32E9ECFF5DD428B79BC775270C01B /* UIImageView+HighlightedWebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+HighlightedWebCache.h"; path = "SDWebImage/UIImageView+HighlightedWebCache.h"; sourceTree = "<group>"; }; 6C3272EAA3C0980C4202A1905CC4E11F /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = "<group>"; }; 6D1ED0920F93C04C1267CB6D1159FCFA /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; }; 6D3217F9594A01CBC4656983FF2479B8 /* UIActivityIndicatorView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIActivityIndicatorView+AFNetworking.h"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.h"; sourceTree = "<group>"; }; 6E3D9F5A4F34E24D12ACAB66FE2D11ED /* SVProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.release.xcconfig; sourceTree = "<group>"; }; 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYCache/YYDiskCache.h; sourceTree = "<group>"; }; 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardReturnKeyHandler.h; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.h; sourceTree = "<group>"; }; 6B3D311CC989B02E43F1BABC1BA52A9B /* YYModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-prefix.pch"; sourceTree = "<group>"; }; 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-umbrella.h"; sourceTree = "<group>"; }; 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.debug.xcconfig; sourceTree = "<group>"; }; 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageFrame.h; path = SDWebImage/SDWebImageFrame.h; sourceTree = "<group>"; }; 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = "<group>"; }; 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloaderOperation.h; path = SDWebImage/SDWebImageDownloaderOperation.h; sourceTree = "<group>"; }; 6E40F103D1F2E2CA838F80D0BE5EFC4D /* Pods-BuWanVideo2.0-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-BuWanVideo2.0-dummy.m"; sourceTree = "<group>"; }; 6E958BABDCCA42C6600F2E2494B6EDB6 /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYCache/YYMemoryCache.h; sourceTree = "<group>"; }; 6FB9E56DB5BC8D81CC60E34C94B26F2A /* YYImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.release.xcconfig; sourceTree = "<group>"; }; 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoderHelper.m; path = SDWebImage/SDWebImageCoderHelper.m; sourceTree = "<group>"; }; 6FE8C410B33DC810A88573107F71567C /* Pods-BuWanVideo2.0-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-BuWanVideo2.0-acknowledgements.plist"; sourceTree = "<group>"; }; 6FF52E3498C63283AC2D3B581BAC2018 /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYImage/YYImageCoder.m; sourceTree = "<group>"; }; 705A0D7C97FACC4E5EC237F4890864AC /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; }; 7116D0BE1A35B813BE766D6D05A0619E /* AFImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFImageDownloader.m; path = "UIKit+AFNetworking/AFImageDownloader.m"; sourceTree = "<group>"; }; 71B0F349529BA5E42ACE2AAD3502BF81 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = "<group>"; }; 75BFC838A48D059D000B143191621658 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = "<group>"; }; 7134F20032CBB294C097E37753D0B990 /* YYImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-prefix.pch"; sourceTree = "<group>"; }; 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; }; 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = "<group>"; }; 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; }; 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCoder.m; path = YYImage/YYImageCoder.m; sourceTree = "<group>"; }; 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTitleBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.h; sourceTree = "<group>"; }; 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIWindow+Hierarchy.h"; path = "IQKeyBoardManager/Categories/IQUIWindow+Hierarchy.h"; sourceTree = "<group>"; }; 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYCache.m; path = YYCache/YYCache.m; sourceTree = "<group>"; }; 7638712A13A5F60164DFF839C026997C /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; }; 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQNSArray+Sort.h"; path = "IQKeyBoardManager/Categories/IQNSArray+Sort.h"; sourceTree = "<group>"; }; 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = "<group>"; }; 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UITableView+SDAutoTableViewCellHeight.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.h"; sourceTree = "<group>"; }; 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = "<group>"; }; 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+SDAutoLayout.h"; path = "SDAutoLayoutDemo/SDAutoLayout/UIView+SDAutoLayout.h"; sourceTree = "<group>"; }; 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYImage/YYSpriteSheetImage.m; sourceTree = "<group>"; }; 7AD6E8DFA8A95F045C0E5EACCECE804C /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; }; 7AE622C260D00CD5E4191DF952109CE7 /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; }; 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManagerConstants.h; path = IQKeyBoardManager/Constants/IQKeyboardManagerConstants.h; sourceTree = "<group>"; }; 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BuWanVideo2.0.debug.xcconfig"; sourceTree = "<group>"; }; 7BB33FD39B6EB78AA6962EADAE8327BE /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; }; 7C98B29E8D89A81D1387C37712D41FA2 /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = "<group>"; }; 7DCD795D6D436433D8513D625C1F4B95 /* AFAutoPurgingImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFAutoPurgingImageCache.h; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.h"; sourceTree = "<group>"; }; 7FECEB8272DD645EA9A1A1D7968AF57A /* SDWebImageCoderHelper.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoderHelper.h; path = SDWebImage/SDWebImageCoderHelper.h; sourceTree = "<group>"; }; 805B652EBBA7C6765EB1F278425EAC8C /* SDAutoLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-umbrella.h"; sourceTree = "<group>"; }; 81548F4A58870D59D757ECB8B0F049EE /* SDWebImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCoder.h; path = SDWebImage/SDWebImageCoder.h; sourceTree = "<group>"; }; 81BAB14F5675EB0EDA17E256692A1805 /* YYModel-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-prefix.pch"; sourceTree = "<group>"; }; 82AE28987B77CBBAC357CF3D18FD6380 /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYCache/YYCache.h; sourceTree = "<group>"; }; 83596981192A82848FACA789662D9901 /* SDImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCache.m; path = SDWebImage/SDImageCache.m; sourceTree = "<group>"; }; 83DEE7CF6B8BB33E1CDD7AF83B5E5A22 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = "<group>"; }; 863DAD78E2015EF5B32B2C0CC5DF43F6 /* SDAutoLayout.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SDAutoLayout.debug.xcconfig; sourceTree = "<group>"; }; 8650119DBDF3E87904B9B930C9397085 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = "<group>"; }; 88854802C8D6ECD2E568328596013DCF /* YYImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-prefix.pch"; sourceTree = "<group>"; }; 8D3C03CB040CFEA369343B72C9560623 /* SVRadialGradientLayer.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVRadialGradientLayer.m; path = SVProgressHUD/SVRadialGradientLayer.m; sourceTree = "<group>"; }; 90AF2BB7F4CBFCAFFCAE46A3FFB7BBDF /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = "<group>"; }; 9122F074E71E32095F4BA2C2BB54766F /* UIImage+GIF.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+GIF.h"; path = "SDWebImage/UIImage+GIF.h"; sourceTree = "<group>"; }; 917BA836D7C13F78F6697BAD9E2DE008 /* YYModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYModel-Info.plist"; sourceTree = "<group>"; }; 9278DF4F04872AD2664E2DF7199A12D9 /* YYDiskCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYDiskCache.h; path = YYCache/YYDiskCache.h; sourceTree = "<group>"; }; 9393AA800AFDC41C6F734BB3A8238193 /* AFNetworking-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "AFNetworking-dummy.m"; sourceTree = "<group>"; }; 94C8DB723C58DDF55DE2F00813F6A348 /* YYModel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.release.xcconfig; sourceTree = "<group>"; }; 9659961AA138D0C1F08083D5FE93160F /* UIImageView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+WebCache.h"; path = "SDWebImage/UIImageView+WebCache.h"; sourceTree = "<group>"; }; 96B11C6B0777E095949C517DFB9FA790 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; }; 97B4E305A01EE1D93F4AFD5EB979439C /* AFURLSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLSessionManager.h; path = AFNetworking/AFURLSessionManager.h; sourceTree = "<group>"; }; 985F852E09A6DE92A217698DBE1C7A09 /* UIImageView+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+YYWebImage.h"; path = "YYWebImage/Categories/UIImageView+YYWebImage.h"; sourceTree = "<group>"; }; 992BBEA2CFD95D37FDFFD5D0AEFF2DE9 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = "<group>"; }; 997455D8DC27099C363663C9B9A89A97 /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; }; 9A9463816975647F423903B984950F61 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; }; 9AA96052761DA3017AFE543C2DBEE398 /* UIImage+MultiFormat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+MultiFormat.h"; path = "SDWebImage/UIImage+MultiFormat.h"; sourceTree = "<group>"; }; 9BBD2BADF01405E0910DB86D699636F1 /* SDWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDWebImage-dummy.m"; sourceTree = "<group>"; }; 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYKVStorage.m; path = YYCache/YYKVStorage.m; sourceTree = "<group>"; }; 7DE8C593B8367EAF68AD4DCF1102981A /* YYModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYModel.modulemap; sourceTree = "<group>"; }; 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLRequestSerialization.m; path = AFNetworking/AFURLRequestSerialization.m; sourceTree = "<group>"; }; 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIView+IQKeyboardToolbar.m"; path = "IQKeyBoardManager/IQToolbar/IQUIView+IQKeyboardToolbar.m"; sourceTree = "<group>"; }; 80052075A66CB61EFC5C01C3A9B556F7 /* YYWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-prefix.pch"; sourceTree = "<group>"; }; 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFSecurityPolicy.h; path = AFNetworking/AFSecurityPolicy.h; sourceTree = "<group>"; }; 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTitleBarButtonItem.m; path = IQKeyBoardManager/IQToolbar/IQTitleBarButtonItem.m; sourceTree = "<group>"; }; 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYFrameImage.h; path = YYImage/YYFrameImage.h; sourceTree = "<group>"; }; 86CBDEBB1EF16BE5599C7B3C764E1B78 /* IQKeyboardManager.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = IQKeyboardManager.modulemap; sourceTree = "<group>"; }; 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYMemoryCache.h; path = YYCache/YYMemoryCache.h; sourceTree = "<group>"; }; 87A93D738A57DCA03A5F89B311F2D61A /* SDWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SDWebImage.modulemap; sourceTree = "<group>"; }; 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = "wrapper.plug-in"; name = SVProgressHUD.bundle; path = SVProgressHUD/SVProgressHUD.bundle; sourceTree = "<group>"; }; 886CECEF031D4E8EBE4FAD2041707202 /* SDWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-prefix.pch"; sourceTree = "<group>"; }; 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVIndefiniteAnimatedView.m; path = SVProgressHUD/SVIndefiniteAnimatedView.m; sourceTree = "<group>"; }; 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = "<group>"; }; 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-umbrella.h"; sourceTree = "<group>"; }; 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+WebCache.h"; path = "SDWebImage/UIButton+WebCache.h"; sourceTree = "<group>"; }; 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; }; 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = "<group>"; }; 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYCache-dummy.m"; sourceTree = "<group>"; }; 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = "<group>"; }; 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = "<group>"; }; 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = "<group>"; }; 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = KeyboardManager.h; path = IQKeyBoardManager/KeyboardManager.h; sourceTree = "<group>"; }; 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYWebImage-dummy.m"; sourceTree = "<group>"; }; 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYWebImage.h"; path = "YYWebImage/Categories/UIImage+YYWebImage.h"; sourceTree = "<group>"; }; 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYWebImage/Categories/CALayer+YYWebImage.m"; sourceTree = "<group>"; }; 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFAutoPurgingImageCache.m; path = "UIKit+AFNetworking/AFAutoPurgingImageCache.m"; sourceTree = "<group>"; }; 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCacheOperation.m"; path = "SDWebImage/UIView+WebCacheOperation.m"; sourceTree = "<group>"; }; 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = IQKeyboardManager.framework; path = IQKeyboardManager.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 992112BE47ED0CD282A19A686DEC5FA8 /* IQKeyboardManager-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-prefix.pch"; sourceTree = "<group>"; }; 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImage.m; path = YYImage/YYImage.m; sourceTree = "<group>"; }; 9BC90E4D272CEA5634B637942FBA7CFF /* YYCache.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = YYCache.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 9C1A7AD2C0F605984A579EDB6CF18080 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; }; 9C30811C95136D9412C3EF9DF03E3A3B /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; }; 9CE294E8F0E5A8A5B23DCF1CEE6CD7D6 /* UIKit+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIKit+AFNetworking.h"; path = "UIKit+AFNetworking/UIKit+AFNetworking.h"; sourceTree = "<group>"; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; A036F5A865F8074B6C533A9636BA5584 /* SDWebImageGIFCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageGIFCoder.h; path = SDWebImage/SDWebImageGIFCoder.h; sourceTree = "<group>"; }; A191B06F544F9EA0767C1656E60D83D8 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; }; 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.debug.xcconfig; sourceTree = "<group>"; }; 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUITextFieldView+Additions.h"; path = "IQKeyBoardManager/Categories/IQUITextFieldView+Additions.h"; sourceTree = "<group>"; }; 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFImageDownloader.h; path = "UIKit+AFNetworking/AFImageDownloader.h"; sourceTree = "<group>"; }; 9FFE6337C733122EF8FD39AD185A6F77 /* AFNetworking-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "AFNetworking-Info.plist"; sourceTree = "<group>"; }; A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImageCoder.h; path = YYImage/YYImageCoder.h; sourceTree = "<group>"; }; A1E5E3B69E93987B632086B93782F078 /* AFNetworking-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "AFNetworking-prefix.pch"; sourceTree = "<group>"; }; A25D4294B555D413AB588FBA8F96B306 /* IQKeyboardManager-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "IQKeyboardManager-Info.plist"; sourceTree = "<group>"; }; A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.release.xcconfig; sourceTree = "<group>"; }; A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCodersManager.h; path = SDWebImage/SDWebImageCodersManager.h; sourceTree = "<group>"; }; A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = AFNetworking.framework; path = AFNetworking.framework; sourceTree = BUILT_PRODUCTS_DIR; }; A71911B340E007EB23030810A80245EC /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = "<group>"; }; A926B1EBDA47D27718FEF94DA4943176 /* YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYModel.h; path = YYModel/YYModel.h; sourceTree = "<group>"; }; A9716D80F403ADFAEFFFD79F213BEA6B /* YYImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYImage-dummy.m"; sourceTree = "<group>"; }; AB539581931047577E5269BBB5770FA8 /* SDWebImageManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageManager.h; path = SDWebImage/SDWebImageManager.h; sourceTree = "<group>"; }; AC1A4624D3723E99D5F3D4F013D24856 /* SDWebImageTransition.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageTransition.h; path = SDWebImage/SDWebImageTransition.h; sourceTree = "<group>"; }; AC4CA4EE201E4C152503BD2E5F262390 /* YYClassInfo.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYClassInfo.m; path = YYModel/YYClassInfo.m; sourceTree = "<group>"; }; AD4CD0582C8FDBAB40F29C7202E9CCEC /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; }; ADAFC761A5988605B4DA5DD3B4EE8536 /* YYKVStorage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYKVStorage.h; path = YYCache/YYKVStorage.h; sourceTree = "<group>"; }; B006573E4EB85905041B6A138C810266 /* UIProgressView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIProgressView+AFNetworking.h"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.h"; sourceTree = "<group>"; }; A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDAnimatedImageRep.m; path = SDWebImage/SDAnimatedImageRep.m; sourceTree = "<group>"; }; A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = IQKeyboardManager.debug.xcconfig; sourceTree = "<group>"; }; A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkActivityIndicatorManager.h; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.h"; sourceTree = "<group>"; }; A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImagePrefetcher.h; path = SDWebImage/SDWebImagePrefetcher.h; sourceTree = "<group>"; }; A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+ForceDecode.h"; path = "SDWebImage/UIImage+ForceDecode.h"; sourceTree = "<group>"; }; A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-umbrella.h"; sourceTree = "<group>"; }; AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQToolbar.h; path = IQKeyBoardManager/IQToolbar/IQToolbar.h; sourceTree = "<group>"; }; AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = "<group>"; }; ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYModel-umbrella.h"; sourceTree = "<group>"; }; AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYWebImage.debug.xcconfig; sourceTree = "<group>"; }; AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; }; B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQTextView.h; path = IQKeyBoardManager/IQTextView/IQTextView.h; sourceTree = "<group>"; }; B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIButton+WebCache.m"; path = "SDWebImage/UIButton+WebCache.m"; sourceTree = "<group>"; }; B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SDWebImage.framework; path = SDWebImage.framework; sourceTree = BUILT_PRODUCTS_DIR; }; B449A3E70F510F20309AEE1F8E7338D6 /* YYDiskCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYDiskCache.m; path = YYCache/YYDiskCache.m; sourceTree = "<group>"; }; B4BB1AACAFD47360E043BEA2412916A9 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; }; B748BAD2A67F8F50CAAFE1FC548C2E8D /* _YYWebImageSetter.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = _YYWebImageSetter.m; path = YYWebImage/Categories/_YYWebImageSetter.m; sourceTree = "<group>"; }; B75FA39EDA8A66E554F9ACACA911A521 /* AFSecurityPolicy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFSecurityPolicy.m; path = AFNetworking/AFSecurityPolicy.m; sourceTree = "<group>"; }; B8495BD79505433FCA75DF8E04C6978D /* SDAnimatedImageRep.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAnimatedImageRep.h; path = SDWebImage/SDAnimatedImageRep.h; sourceTree = "<group>"; }; B9C0F5AC04DFCC94CB01CA54FDCE85B0 /* SDWebImageCodersManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCodersManager.m; path = SDWebImage/SDWebImageCodersManager.m; sourceTree = "<group>"; }; BD4EAA316F2314ADD73F798028882FCA /* YYImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYImage.modulemap; sourceTree = "<group>"; }; BEA7E182CF4126FE52BF333A77DEC1BE /* YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYWebImage.h; path = YYWebImage/YYWebImage.h; sourceTree = "<group>"; }; BEE119170C3A7B367B14F13E15219D97 /* SDWebImageOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageOperation.h; path = SDWebImage/SDWebImageOperation.h; sourceTree = "<group>"; }; BF1FFAD1010C059FD96AD4DBA2DBABE3 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYModel/YYClassInfo.h; sourceTree = "<group>"; }; BF667BB59056E36D3586F9C14DAC1F40 /* MKAnnotationView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "MKAnnotationView+YYWebImage.m"; path = "YYWebImage/Categories/MKAnnotationView+YYWebImage.m"; sourceTree = "<group>"; }; B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageDownloader.h; path = SDWebImage/SDWebImageDownloader.h; sourceTree = "<group>"; }; B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-umbrella.h"; sourceTree = "<group>"; }; B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCompat.m; path = SDWebImage/SDWebImageCompat.m; sourceTree = "<group>"; }; B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFHTTPSessionManager.m; path = AFNetworking/AFHTTPSessionManager.m; sourceTree = "<group>"; }; B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSData+ImageContentType.m"; path = "SDWebImage/NSData+ImageContentType.m"; sourceTree = "<group>"; }; B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIViewController+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.m"; sourceTree = "<group>"; }; B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImageView+AFNetworking.h"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.h"; sourceTree = "<group>"; }; B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+YYWebImage.m"; path = "YYWebImage/Categories/UIImage+YYWebImage.m"; sourceTree = "<group>"; }; B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-umbrella.h"; sourceTree = "<group>"; }; BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIButton+AFNetworking.h"; path = "UIKit+AFNetworking/UIButton+AFNetworking.h"; sourceTree = "<group>"; }; BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = SVProgressHUD.release.xcconfig; sourceTree = "<group>"; }; BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLResponseSerialization.m; path = AFNetworking/AFURLResponseSerialization.m; sourceTree = "<group>"; }; BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = "<group>"; }; BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQTextView.m; path = IQKeyBoardManager/IQTextView/IQTextView.m; sourceTree = "<group>"; }; BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYImage-dummy.m"; sourceTree = "<group>"; }; BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-BuWanVideo2.0.release.xcconfig"; sourceTree = "<group>"; }; C0FDE9DA859C326ED19D483AF38BDD78 /* AFNetworking.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = AFNetworking.debug.xcconfig; sourceTree = "<group>"; }; C26BE6D5F05DD33F43B2DA0EE4AB6A3F /* YYModel.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.debug.xcconfig; sourceTree = "<group>"; }; C2B02D064FCD002A5F68262C9E0ABF1F /* YYImageCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYImageCache.m; path = YYWebImage/YYImageCache.m; sourceTree = "<group>"; }; C2CEA0307F8697286A315010110C46F4 /* UIImage+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+AFNetworking.h"; path = "UIKit+AFNetworking/UIImage+AFNetworking.h"; sourceTree = "<group>"; }; C5C3B937BA90EC2B875E499C709021BD /* SDWebImageImageIOCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageImageIOCoder.m; path = SDWebImage/SDWebImageImageIOCoder.m; sourceTree = "<group>"; }; C7655860107BCDC2897D49C3E995BA22 /* UIView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIView+WebCache.m"; path = "SDWebImage/UIView+WebCache.m"; sourceTree = "<group>"; }; C980A818C139897278AF20D53841C691 /* AFHTTPSessionManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFHTTPSessionManager.h; path = AFNetworking/AFHTTPSessionManager.h; sourceTree = "<group>"; }; CA4ADDA4947596B669704CFDBD18111D /* YYCache-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYCache-umbrella.h"; sourceTree = "<group>"; }; CEEAEC1C6300B4039E15D459577F4ADD /* YYImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYImage.h; path = YYImage/YYImage.h; sourceTree = "<group>"; }; D1C4E2E999566FCCE98BB31BF78222E5 /* YYAnimatedImageView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYAnimatedImageView.h; path = YYImage/YYAnimatedImageView.h; sourceTree = "<group>"; }; D1DA9D6D22497E708E7152EEDCA290B7 /* UIImageView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+AFNetworking.m"; path = "UIKit+AFNetworking/UIImageView+AFNetworking.m"; sourceTree = "<group>"; }; D23F19B16B57D0A66373E8372683A768 /* UIImage+YYWebImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIImage+YYWebImage.h"; path = "YYWebImage/Categories/UIImage+YYWebImage.h"; sourceTree = "<group>"; }; D2EDA0DD8D9C69FF292D109065E99595 /* _YYWebImageSetter.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = _YYWebImageSetter.h; path = YYWebImage/Categories/_YYWebImageSetter.h; sourceTree = "<group>"; }; D3FCDB01193CF0A5DBC22B48F64CA2E5 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; }; D573368EACBB1A0F70E136154886C6F1 /* YYCache.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYCache.release.xcconfig; sourceTree = "<group>"; }; C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageCompat.h; path = SDWebImage/SDWebImageCompat.h; sourceTree = "<group>"; }; C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIRefreshControl+AFNetworking.h"; path = "UIKit+AFNetworking/UIRefreshControl+AFNetworking.h"; sourceTree = "<group>"; }; C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSButton+WebCache.m"; path = "SDWebImage/NSButton+WebCache.m"; sourceTree = "<group>"; }; C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SVProgressAnimatedView.m; path = SVProgressHUD/SVProgressAnimatedView.m; sourceTree = "<group>"; }; C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSImage+WebCache.h"; path = "SDWebImage/NSImage+WebCache.h"; sourceTree = "<group>"; }; C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYSpriteSheetImage.h; path = YYImage/YYSpriteSheetImage.h; sourceTree = "<group>"; }; C6AFABD9240597E93FCDAC14C3E51C57 /* YYModel-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYModel-Info.plist"; sourceTree = "<group>"; }; C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; }; C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLRequestSerialization.h; path = AFNetworking/AFURLRequestSerialization.h; sourceTree = "<group>"; }; C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYModel-dummy.m"; sourceTree = "<group>"; }; CA4B9B1C91E57BF82783779720252630 /* SVProgressHUD-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SVProgressHUD-prefix.pch"; sourceTree = "<group>"; }; CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYClassInfo.h; path = YYModel/YYClassInfo.h; sourceTree = "<group>"; }; CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFURLSessionManager.m; path = AFNetworking/AFURLSessionManager.m; sourceTree = "<group>"; }; D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSObject+YYModel.h"; path = "YYModel/NSObject+YYModel.h"; sourceTree = "<group>"; }; D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDWebImageImageIOCoder.h; path = SDWebImage/SDWebImageImageIOCoder.h; sourceTree = "<group>"; }; D436DD56400948B8D2F8E227212BEA3A /* SDAutoLayout-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "SDAutoLayout-Info.plist"; sourceTree = "<group>"; }; D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkActivityIndicatorManager.m; path = "UIKit+AFNetworking/AFNetworkActivityIndicatorManager.m"; sourceTree = "<group>"; }; D60872E5F1A73BD7F0996C3C3924A93E /* Pods-BuWanVideo2.0-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-BuWanVideo2.0-frameworks.sh"; sourceTree = "<group>"; }; D6CC0BC58E6A14ABD34579D3C8282037 /* YYWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYWebImage-Info.plist"; sourceTree = "<group>"; }; D729A3449394AD8ED95EB96B57BA219C /* Pods-BuWanVideo2.0.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-BuWanVideo2.0.modulemap"; sourceTree = "<group>"; }; D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "SDAutoLayout-dummy.m"; sourceTree = "<group>"; }; D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; }; D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYModel.release.xcconfig; sourceTree = "<group>"; }; DA9BD546B398156542593B6FD8FA13D6 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; }; DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIProgressView+AFNetworking.m"; path = "UIKit+AFNetworking/UIProgressView+AFNetworking.m"; sourceTree = "<group>"; }; DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDImageCacheConfig.m; path = SDWebImage/SDImageCacheConfig.m; sourceTree = "<group>"; }; DC28EB883B85E7DCE6D363A89A6741C6 /* MobileCoreServices.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MobileCoreServices.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/MobileCoreServices.framework; sourceTree = DEVELOPER_DIR; }; DC3CAFC5CD677A3FE639DF7530A4ADCA /* SDImageCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCache.h; path = SDWebImage/SDImageCache.h; sourceTree = "<group>"; }; DCEDD6333679A360EB8D7ECAD8F58673 /* YYWebImage-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYWebImage-prefix.pch"; sourceTree = "<group>"; }; DE03CFC1EAF91C6D650F822D59FC4A84 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = "<group>"; }; DE13C1B71E09CBA1280D586437C8F5FA /* CALayer+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "CALayer+YYWebImage.m"; path = "YYWebImage/Categories/CALayer+YYWebImage.m"; sourceTree = "<group>"; }; E15645E83B82404CE1FE18EA81F72477 /* UIView+WebCacheOperation.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCacheOperation.h"; path = "SDWebImage/UIView+WebCacheOperation.h"; sourceTree = "<group>"; }; E1D04B1119AC447A80F102EFF06A6255 /* SDImageCacheConfig.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDImageCacheConfig.h; path = SDWebImage/SDImageCacheConfig.h; sourceTree = "<group>"; }; DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQKeyboardManager.h; path = IQKeyBoardManager/IQKeyboardManager.h; sourceTree = "<group>"; }; DC6E37E1052C3C2235209A3A867F0A76 /* YYImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYImage-Info.plist"; sourceTree = "<group>"; }; DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFURLResponseSerialization.h; path = AFNetworking/AFURLResponseSerialization.h; sourceTree = "<group>"; }; DF3E5DE912602F028F7F75A6ABC70A43 /* AFNetworking.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = AFNetworking.modulemap; sourceTree = "<group>"; }; E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IQKeyboardReturnKeyHandler.m; path = IQKeyBoardManager/IQKeyboardReturnKeyHandler.m; sourceTree = "<group>"; }; E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = YYModel.framework; path = YYModel.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E6DD4676503B9A73639A64D61E1EA9C6 /* UIImageView+YYWebImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+YYWebImage.m"; path = "YYWebImage/Categories/UIImageView+YYWebImage.m"; sourceTree = "<group>"; }; E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressAnimatedView.h; path = SVProgressHUD/SVProgressAnimatedView.h; sourceTree = "<group>"; }; E700DBDACCC1B25FAAA670E476A16FFF /* AssetsLibrary.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AssetsLibrary.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/AssetsLibrary.framework; sourceTree = DEVELOPER_DIR; }; E88CB227C198689588E72922C1880076 /* WebP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebP.framework; path = Vendor/WebP.framework; sourceTree = "<group>"; }; E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = SVProgressHUD.framework; path = SVProgressHUD.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E9AFCFB91D095698C39819DE34185083 /* YYSpriteSheetImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYSpriteSheetImage.m; path = YYImage/YYSpriteSheetImage.m; sourceTree = "<group>"; }; EA9826C34F97624CE5824110846935FE /* UIImage+ForceDecode.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImage+ForceDecode.m"; path = "SDWebImage/UIImage+ForceDecode.m"; sourceTree = "<group>"; }; F1476DBFA9F5095C630635B7ED3AEC9D /* AFNetworkReachabilityManager.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = AFNetworkReachabilityManager.h; path = AFNetworking/AFNetworkReachabilityManager.h; sourceTree = "<group>"; }; F2649A1672B78FB519344A2F9C548790 /* YYWebImage.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYWebImage.modulemap; sourceTree = "<group>"; }; F52BC92DA418D92868352F4C9D911068 /* SDAutoLayout.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SDAutoLayout.h; path = SDAutoLayoutDemo/SDAutoLayout/SDAutoLayout.h; sourceTree = "<group>"; }; F632A28CEA762627A6ED8CA069E8419D /* SDWebImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDWebImage-umbrella.h"; sourceTree = "<group>"; }; F709D93F04955DB6D32ACE07BA1AAAD7 /* YYModel-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "YYModel-dummy.m"; sourceTree = "<group>"; }; F7AF83F8B6A491743B74656DAEB42504 /* YYModel.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = YYModel.modulemap; sourceTree = "<group>"; }; F80080175678CE343D3AAB9E925DA1BA /* YYAnimatedImageView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYAnimatedImageView.m; path = YYImage/YYAnimatedImageView.m; sourceTree = "<group>"; }; E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYFrameImage.m; path = YYImage/YYFrameImage.m; sourceTree = "<group>"; }; EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageTransition.m; path = SDWebImage/SDWebImageTransition.m; sourceTree = "<group>"; }; ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYModel/NSObject+YYModel.m"; sourceTree = "<group>"; }; EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IQBarButtonItem.h; path = IQKeyBoardManager/IQToolbar/IQBarButtonItem.h; sourceTree = "<group>"; }; F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVProgressHUD.h; path = SVProgressHUD/SVProgressHUD.h; sourceTree = "<group>"; }; F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "UIView+WebCache.h"; path = "SDWebImage/UIView+WebCache.h"; sourceTree = "<group>"; }; F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = YYImage.release.xcconfig; sourceTree = "<group>"; }; F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Pods_BuWanVideo2_0.framework; path = "Pods-BuWanVideo2.0.framework"; sourceTree = BUILT_PRODUCTS_DIR; }; F8F7BFE3D88FCC88A6C6C2724B3A084A /* NSObject+YYModel.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "NSObject+YYModel.m"; path = "YYModel/NSObject+YYModel.m"; sourceTree = "<group>"; }; F9D18BA94759BAFE5F10CB799004577D /* UIImageView+WebCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIImageView+WebCache.m"; path = "SDWebImage/UIImageView+WebCache.m"; sourceTree = "<group>"; }; F9EDE8A71F8751B2B740F4FAEFA1ADA0 /* UMCCommon.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UMCCommon.debug.xcconfig; sourceTree = "<group>"; }; F9F3F58FCB07AA431128E53E86525582 /* SVIndefiniteAnimatedView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = SVIndefiniteAnimatedView.h; path = SVProgressHUD/SVIndefiniteAnimatedView.h; sourceTree = "<group>"; }; FA578C3DD6985D46AC7D739BDDAD1C16 /* YYMemoryCache.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = YYMemoryCache.m; path = YYCache/YYMemoryCache.m; sourceTree = "<group>"; }; FAF958AAB2DF960FD4FE53CED99EF2D6 /* SDWebImageDownloader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageDownloader.m; path = SDWebImage/SDWebImageDownloader.m; sourceTree = "<group>"; }; FB4E26241C34984861F0AEB98573302B /* SDWebImageCoder.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageCoder.m; path = SDWebImage/SDWebImageCoder.m; sourceTree = "<group>"; }; FFB783FBACD8D09E969B3233959D2D0E /* UIActivityIndicatorView+AFNetworking.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UIActivityIndicatorView+AFNetworking.m"; path = "UIKit+AFNetworking/UIActivityIndicatorView+AFNetworking.m"; sourceTree = "<group>"; }; F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = AFNetworkReachabilityManager.m; path = AFNetworking/AFNetworkReachabilityManager.m; sourceTree = "<group>"; }; F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "UITableView+SDAutoTableViewCellHeight.m"; path = "SDAutoLayoutDemo/SDAutoLayout/UITableView+SDAutoTableViewCellHeight.m"; sourceTree = "<group>"; }; FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = SDWebImageManager.m; path = SDWebImage/SDWebImageManager.m; sourceTree = "<group>"; }; FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = "IQUIScrollView+Additions.m"; path = "IQKeyBoardManager/Categories/IQUIScrollView+Additions.m"; sourceTree = "<group>"; }; FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "IQUIViewController+Additions.h"; path = "IQKeyBoardManager/Categories/IQUIViewController+Additions.h"; sourceTree = "<group>"; }; FC4BDE0C141DAE902F587415F361A4D8 /* YYWebImage-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "YYWebImage-Info.plist"; sourceTree = "<group>"; }; FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = "NSButton+WebCache.h"; path = "SDWebImage/NSButton+WebCache.h"; sourceTree = "<group>"; }; FCD4E9507A1EF5D6F511F0C033266E5E /* SVProgressHUD.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = SVProgressHUD.modulemap; sourceTree = "<group>"; }; FDA60A6242FB5E5E939171F483393755 /* SDAutoLayout-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "SDAutoLayout-prefix.pch"; sourceTree = "<group>"; }; FEB39772AA9566576BC914AFC4FD3A75 /* UMCommon.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = UMCommon.framework; sourceTree = "<group>"; }; FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "YYImage-umbrella.h"; sourceTree = "<group>"; }; FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = YYCache.h; path = YYCache/YYCache.h; sourceTree = "<group>"; }; FFED48445D4C690FD88E438116ED89BD /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Accelerate.framework; sourceTree = DEVELOPER_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 07DB1611B26D2EB8B945F931B69A52F4 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( D09EF4AC8FC4676ED0ACA92A7C4D979A /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 132333E09046EE34F025B32A95AA115D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -538,14 +624,6 @@ 0D5FD6CC0D49C8A7C922E477C48145C7 /* Foundation.framework in Frameworks */, 91B9A2A4C61C5D595A0F0419A325AC40 /* QuartzCore.framework in Frameworks */, 14F89168C65A740ADEDEA99DEE53C70F /* UIKit.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 466A5C9CC91CFB2A2D32AEDCA13EFBA3 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( CB704E6C8CC04FDCE402502A995BBCA5 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -582,6 +660,14 @@ files = ( 2D173375C6C4C3373A225D9D769BE12E /* Foundation.framework in Frameworks */, 3736A8BCD00246F0307314AFF8A722F1 /* ImageIO.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; 9D1C768C597BF82E5D67B19EA3F55A6D /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 97F1A9CA6BBC0096DF0C1FFC7E66A90F /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -631,145 +717,218 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 0C814CCE5D581DB56D53061E3410B755 /* Support Files */ = { 014470781AF4760CC00E1BBE4ECF6C64 /* Core */ = { isa = PBXGroup; children = ( 08D2FC51A83809AD0A0B791893315AFA /* AFNetworking.modulemap */, 9393AA800AFDC41C6F734BB3A8238193 /* AFNetworking-dummy.m */, 4847C41DA1E4C8B4F0815A835E2A252F /* AFNetworking-Info.plist */, 24FF8FB316DCFEFF7280CD09F6014776 /* AFNetworking-prefix.pch */, 5554C9194C38D558307E5EBF72E3A38B /* AFNetworking-umbrella.h */, C0FDE9DA859C326ED19D483AF38BDD78 /* AFNetworking.debug.xcconfig */, 087FEBFF0DAAC636E025FF25ECF3569E /* AFNetworking.release.xcconfig */, 4CC378B1DA059277B1DB48FEA6D95695 /* YYAnimatedImageView.h */, 67CEF7643E18673E24232F356F77380D /* YYAnimatedImageView.m */, 85986F6F80A890AB51E97FEB19D339AF /* YYFrameImage.h */, E9AFD35E94021D0EC91CD4E9A6874ADA /* YYFrameImage.m */, 0E0330675D0150100081993C047FB3D7 /* YYImage.h */, 993B95BCCFEC31E992AB4F34B7677DEB /* YYImage.m */, A09E028517389C3AC406E3E5ADCC7372 /* YYImageCoder.h */, 735F66840C380AE30470C97BF7AC301B /* YYImageCoder.m */, C63621A41D21E370BA7572D25405DE87 /* YYSpriteSheetImage.h */, 7A217778F71886BDEB622CABA8D17505 /* YYSpriteSheetImage.m */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; name = Core; sourceTree = "<group>"; }; 10196508E9B9A0DF46A811218AC2F823 /* Frameworks */ = { 03D82A2D2EAEAC7BAE2227B55CAC5287 /* WebP */ = { isa = PBXGroup; children = ( D3FCDB01193CF0A5DBC22B48F64CA2E5 /* UMCommon.framework */, 1FAB7781DFA9C8ABB121FE008FDF1FAC /* Frameworks */, ); name = WebP; sourceTree = "<group>"; }; 04A92D6FF0F8E1DF9E55BE94F4831887 /* IQKeyboardManager */ = { isa = PBXGroup; children = ( EEDD14A100639499B40FB2C6E5D99C7F /* IQBarButtonItem.h */, 65C8D432CB8AEB2482293031D7FB17EC /* IQBarButtonItem.m */, DC4A8FC0FC0C60FE6D3C4BC0935E8C35 /* IQKeyboardManager.h */, 5FFB0C026B7A9FA00C92CBFD2B008F6C /* IQKeyboardManager.m */, 7B0E5C35357559413BE33DE720EF67CC /* IQKeyboardManagerConstants.h */, 403347D8D64469731D88DFA85E5BF177 /* IQKeyboardManagerConstantsInternal.h */, 6A7D01EB7485DD6573A8E179985B9283 /* IQKeyboardReturnKeyHandler.h */, E2F02E0FA6EDE103A0023DBBF26819E5 /* IQKeyboardReturnKeyHandler.m */, 776F41CDA4D3EC6CDD6E7F54C91B5CA1 /* IQNSArray+Sort.h */, 23BCBFFFAF38ACFE565CD1279A2A7E41 /* IQNSArray+Sort.m */, B06935E915BC7EE24FF39FEC596A42B8 /* IQTextView.h */, BE35A1F11A75919EDB8E585CA0E39584 /* IQTextView.m */, 73A8D0E98CE29AB8E321DF3EE8FEBFB7 /* IQTitleBarButtonItem.h */, 83E7BD087582D365B7C7195190F03660 /* IQTitleBarButtonItem.m */, AB921236EFEEA7E1F0AF90E95E46867C /* IQToolbar.h */, 158B6C4D9030F93BCCE250DFE085B1EF /* IQToolbar.m */, 28BE94CD106A8C4F00420B542A2D9F16 /* IQUIScrollView+Additions.h */, FAFFD33295AEB5A22C7979EE2C1C7E15 /* IQUIScrollView+Additions.m */, 9E62458700016A3E23333F3E8D05EC75 /* IQUITextFieldView+Additions.h */, 1FA3696182C088F327A126D8E13EB9D5 /* IQUITextFieldView+Additions.m */, 199D63082191E4E0094F9E922C5B4353 /* IQUIView+Hierarchy.h */, 064F4C4BF9323C0B2DF7050F670C30D4 /* IQUIView+Hierarchy.m */, 276CE4C9368DCF201C8020FDC956603E /* IQUIView+IQKeyboardToolbar.h */, 7EB860ABE724253F4D37024E0A728E7F /* IQUIView+IQKeyboardToolbar.m */, FB40F6AB3391D3DA0027EC49BD9CE401 /* IQUIViewController+Additions.h */, B61CD6A927AD2A95B66440B87B9D6E45 /* IQUIViewController+Additions.m */, 74D3AD2E8CB8E9FD5B6ADD640D6AAB18 /* IQUIWindow+Hierarchy.h */, 666FDAF0A4607C7E635294B50E8583A8 /* IQUIWindow+Hierarchy.m */, 90FE38F4186C1FBFC016BF52A9211D7A /* KeyboardManager.h */, D8267C6FA2C5F0AB339C82781F3F76C0 /* Resources */, FDA41F2BA38E90C00E951D18DA60AF7F /* Support Files */, ); name = IQKeyboardManager; path = IQKeyboardManager; sourceTree = "<group>"; }; 14B5654852E347080C7A3B5C05D56201 /* Pods */ = { isa = PBXGroup; children = ( F0589110DB2987ADCCF693DC4ADAD4D7 /* AFNetworking */, 04A92D6FF0F8E1DF9E55BE94F4831887 /* IQKeyboardManager */, C6B5658FF107EB1BCEDCA901D3EC8F27 /* SDAutoLayout */, 33564D0CAC800BC8FBCEA5E9DDA8B6FD /* SDWebImage */, 5F57F578425BD660FF01F7813C7044D2 /* SVProgressHUD */, DE6E09649D05347D2C1669D9C3C3E612 /* UMCCommon */, 9E480C914401597A71DC1AE34ED232BF /* YYCache */, 675167C66DE9119C69F6F0D8CE014EB6 /* YYImage */, 36A775F1269A5F8705CC441090C6A651 /* YYModel */, E97A8D5F6664685C9A7712F8F8C5FCC2 /* YYWebImage */, ); name = Pods; sourceTree = "<group>"; }; 1FAB7781DFA9C8ABB121FE008FDF1FAC /* Frameworks */ = { isa = PBXGroup; children = ( 3F23DA8E76BB95245303351117CD4386 /* WebP.framework */, ); name = Frameworks; sourceTree = "<group>"; }; 14E77E0ADFC61E699F43789382ED3F23 /* Support Files */ = { 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */ = { isa = PBXGroup; children = ( F9EDE8A71F8751B2B740F4FAEFA1ADA0 /* UMCCommon.debug.xcconfig */, 659B5F014CB3717763C3D0991CBA9B65 /* UMCCommon.release.xcconfig */, A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */, 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */, F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */, 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */, B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */, E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */, 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */, 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */, E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */, 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */, ); name = Products; sourceTree = "<group>"; }; 30FB8590C566F10DE670DA040395D48E /* Support Files */ = { isa = PBXGroup; children = ( 7DE8C593B8367EAF68AD4DCF1102981A /* YYModel.modulemap */, C98F4C1A08FB254B89E0A2D10711986B /* YYModel-dummy.m */, C6AFABD9240597E93FCDAC14C3E51C57 /* YYModel-Info.plist */, 6B3D311CC989B02E43F1BABC1BA52A9B /* YYModel-prefix.pch */, ADAC7154F49562704B1C3D92C45BDE93 /* YYModel-umbrella.h */, 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */, D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/UMCCommon"; path = "../Target Support Files/YYModel"; sourceTree = "<group>"; }; 1BBB36791DC9D1AE823083C8F6222E3D /* Support Files */ = { 33564D0CAC800BC8FBCEA5E9DDA8B6FD /* SDWebImage */ = { isa = PBXGroup; children = ( F2649A1672B78FB519344A2F9C548790 /* YYWebImage.modulemap */, 350687140426E59616D8739F07A87916 /* YYWebImage-dummy.m */, D6CC0BC58E6A14ABD34579D3C8282037 /* YYWebImage-Info.plist */, DCEDD6333679A360EB8D7ECAD8F58673 /* YYWebImage-prefix.pch */, 2E2206CE9EC4AEDEF09AEBFDE2BD8187 /* YYWebImage-umbrella.h */, 1148079642F8F2244A6A077E1584588E /* YYWebImage.debug.xcconfig */, 2A2A055FFA758CF75B49CB7F7D947308 /* YYWebImage.release.xcconfig */, 3AE31E2FEF59835FD87D826E263C8C7D /* Core */, 6CF2C2566DCD77564B6455D6FABD0D95 /* Support Files */, ); name = "Support Files"; path = "../Target Support Files/YYWebImage"; name = SDWebImage; path = SDWebImage; sourceTree = "<group>"; }; 4441D25D417EA990C274A4C51FD572E3 /* YYImage */ = { 36A775F1269A5F8705CC441090C6A651 /* YYModel */ = { isa = PBXGroup; children = ( 8BCFA56F4B07DB974FAF2B9C1E5737B4 /* Core */, 46565FBEC91829FA3F837EDADDF6E5F2 /* Support Files */, BF84D06E62A4EFF34B962DA8B6A0E903 /* WebP */, D09826676879AB23092A3824F3AD317E /* NSObject+YYModel.h */, ECA462F2698E894555C1B7BFAD347E13 /* NSObject+YYModel.m */, CCAE2CAB49893772FAC15CE03C7F3852 /* YYClassInfo.h */, 34C0815B5388C859B774151CC732E139 /* YYClassInfo.m */, 24FE9AC4A49F1392F5792CA37EAEC008 /* YYModel.h */, 30FB8590C566F10DE670DA040395D48E /* Support Files */, ); name = YYImage; path = YYImage; name = YYModel; path = YYModel; sourceTree = "<group>"; }; 46565FBEC91829FA3F837EDADDF6E5F2 /* Support Files */ = { 3AE31E2FEF59835FD87D826E263C8C7D /* Core */ = { isa = PBXGroup; children = ( BD4EAA316F2314ADD73F798028882FCA /* YYImage.modulemap */, A9716D80F403ADFAEFFFD79F213BEA6B /* YYImage-dummy.m */, 2303A20C880100C6FAF5B33AF0086887 /* YYImage-Info.plist */, 88854802C8D6ECD2E568328596013DCF /* YYImage-prefix.pch */, 3A1409D3664D3CAB402EA7CE354AD2D9 /* YYImage-umbrella.h */, 07D077E1B21B15E749023D615A7878AF /* YYImage.debug.xcconfig */, 6FB9E56DB5BC8D81CC60E34C94B26F2A /* YYImage.release.xcconfig */, FCC7B0B5AB4A56496C01EE23E3318409 /* NSButton+WebCache.h */, C2429A01B58547277CA5AE9257FC93AC /* NSButton+WebCache.m */, 3E53EC95813F9ED2C02C25B21AF2E3C5 /* NSData+ImageContentType.h */, B56A59E1393978801887DEEE848C5740 /* NSData+ImageContentType.m */, C4D5AFF360AAC16FD89F3B5FFE8D68C0 /* NSImage+WebCache.h */, 584CE427BE9EA742C6CBA4761F9A926A /* NSImage+WebCache.m */, 77B7302933BC6D02A196B85DFEC0E21C /* SDAnimatedImageRep.h */, A566BFDC3300AE83207B09AF697540E0 /* SDAnimatedImageRep.m */, C8EE86CD70BDCE1CB83C2AC34F1E1B86 /* SDImageCache.h */, 004B93B66E20FB5EA371BD2D5A2A176D /* SDImageCache.m */, 51BF83A817AC689F9973FE34E2899AA4 /* SDImageCacheConfig.h */, DBE470B5103AAD174FDEFED1D372D753 /* SDImageCacheConfig.m */, 14F5EE7BD6D5A1141C527748161FFCA4 /* SDWebImageCoder.h */, 0972198189366754E8CD85E85F821ECB /* SDWebImageCoder.m */, 15A32433DDA3B649D68B28A0D04D7BB2 /* SDWebImageCoderHelper.h */, 6F55B88B20E8DBC00ADF538D1E100A82 /* SDWebImageCoderHelper.m */, A3A182F138404FF1C5E4492D48F71E32 /* SDWebImageCodersManager.h */, 71D2E008665B2BCE171EA47CFD1CC366 /* SDWebImageCodersManager.m */, C04B499BD8BD9413F843D3F224DDC73B /* SDWebImageCompat.h */, B46936C03AE70A35AD70DD2631D87E30 /* SDWebImageCompat.m */, B450207B23EC4430E17575125E7C6FB9 /* SDWebImageDownloader.h */, 658E17FB1CA6793E7A873F0715999DAE /* SDWebImageDownloader.m */, 6CA21697F97665E4AF1D900C0673BF00 /* SDWebImageDownloaderOperation.h */, 4E8F7E358CF6EE0D4983A0AF618A86D4 /* SDWebImageDownloaderOperation.m */, 6C0772AA815B383D323E200577F058EE /* SDWebImageFrame.h */, 161A37E3C472DFF98A4831F759041736 /* SDWebImageFrame.m */, 8DC5286A839CCD48C7D9CF9DF5B14A27 /* SDWebImageGIFCoder.h */, 2ADDFEF03F03252FDFF3A58029DD1E78 /* SDWebImageGIFCoder.m */, D1493131A3499E59F3F8F82A2789AE2F /* SDWebImageImageIOCoder.h */, 0F1A59D204A792B04690231B282B8936 /* SDWebImageImageIOCoder.m */, 1138BDB8408523552A38A32B6A83A31F /* SDWebImageManager.h */, FAC1E6623FE2473E9F1D8EF980DE2823 /* SDWebImageManager.m */, 00F98CD578C835088BAD11FE1D8FF775 /* SDWebImageOperation.h */, A7E093334DF63FCE9D020F9F47A81A44 /* SDWebImagePrefetcher.h */, 1A344B319BEC0E1B8A28B5AE3C427899 /* SDWebImagePrefetcher.m */, 36D664ED52BFE17EAC61AEF048B9ECC3 /* SDWebImageTransition.h */, EA69C266560FAAE2F7E128E1FF4DD2B5 /* SDWebImageTransition.m */, 8CA14631D059A039D7F2A3ED33F5BAFB /* UIButton+WebCache.h */, B083F83B7B619CF5325F8BEE4EB9D21D /* UIButton+WebCache.m */, A83B21C0E415562B7F3AA852853901B2 /* UIImage+ForceDecode.h */, AC7DD126C303BC63B0A47A864015048F /* UIImage+ForceDecode.m */, 7287F2809D154FC010E08FD9CE21148F /* UIImage+GIF.h */, 277B74DC54F596293D4EC11771448E09 /* UIImage+GIF.m */, 423B0DD5CBA7AEDD53CC8590726B838F /* UIImage+MultiFormat.h */, 32E86A6163A5E145E3A6F38D55B0B80B /* UIImage+MultiFormat.m */, 30F764FDB5F9B0181ED0316445471D3C /* UIImageView+HighlightedWebCache.h */, 21CD7A77387C606806B800301EAED3FF /* UIImageView+HighlightedWebCache.m */, 713B331B5562B59F12D85CBB81461365 /* UIImageView+WebCache.h */, 25805FC802E30CB4DEF62B580AD7C0DC /* UIImageView+WebCache.m */, F6AEAC98FD2F93167BDA306D2DE93C3F /* UIView+WebCache.h */, 8A272000203E690BDDF171A04E002113 /* UIView+WebCache.m */, AF91CF4D12E4987DE5AE0EA3E73FC3C2 /* UIView+WebCacheOperation.h */, 97886E255A49CBF2C6C41BFE4211CCAA /* UIView+WebCacheOperation.m */, ); name = "Support Files"; path = "../Target Support Files/YYImage"; name = Core; sourceTree = "<group>"; }; 47EAB055370456FC5C03160D89674965 /* UIKit */ = { 4CE483645377B852914F927F0CDA9F93 /* Security */ = { isa = PBXGroup; children = ( 7DCD795D6D436433D8513D625C1F4B95 /* AFAutoPurgingImageCache.h */, 1D15DD5FC594A5F83C51C2B5C5F7059A /* AFAutoPurgingImageCache.m */, 6C3272EAA3C0980C4202A1905CC4E11F /* AFImageDownloader.h */, 7116D0BE1A35B813BE766D6D05A0619E /* AFImageDownloader.m */, 83DEE7CF6B8BB33E1CDD7AF83B5E5A22 /* AFNetworkActivityIndicatorManager.h */, 992BBEA2CFD95D37FDFFD5D0AEFF2DE9 /* AFNetworkActivityIndicatorManager.m */, 6D3217F9594A01CBC4656983FF2479B8 /* UIActivityIndicatorView+AFNetworking.h */, FFB783FBACD8D09E969B3233959D2D0E /* UIActivityIndicatorView+AFNetworking.m */, 616BBBA9C9A62F8A84D0501DF8C6E340 /* UIButton+AFNetworking.h */, 19816DCC21F8829134E45E9682BB8160 /* UIButton+AFNetworking.m */, C2CEA0307F8697286A315010110C46F4 /* UIImage+AFNetworking.h */, 4CF37E0998038CB5F5264EBA627D0586 /* UIImageView+AFNetworking.h */, D1DA9D6D22497E708E7152EEDCA290B7 /* UIImageView+AFNetworking.m */, 9CE294E8F0E5A8A5B23DCF1CEE6CD7D6 /* UIKit+AFNetworking.h */, B006573E4EB85905041B6A138C810266 /* UIProgressView+AFNetworking.h */, 5E805DD22ED45B6F62E769AB27215358 /* UIProgressView+AFNetworking.m */, 4754C7BC29204A1FC3183DC44B138108 /* UIRefreshControl+AFNetworking.h */, 2BBD0139397CF24AC5849DD27F21FF27 /* UIRefreshControl+AFNetworking.m */, 83D10C7AF73F0F5A3710124E3370CDE3 /* AFSecurityPolicy.h */, 79FEC923DCFB592C5B0707E8A32F6E99 /* AFSecurityPolicy.m */, ); name = UIKit; sourceTree = "<group>"; }; 4B404848F15BBB63226A8E9C1A6FCBE7 /* YYWebImage */ = { isa = PBXGroup; children = ( D2EDA0DD8D9C69FF292D109065E99595 /* _YYWebImageSetter.h */, B748BAD2A67F8F50CAAFE1FC548C2E8D /* _YYWebImageSetter.m */, 49CDAEC0D81CD6AEF138665058614CEB /* CALayer+YYWebImage.h */, DE13C1B71E09CBA1280D586437C8F5FA /* CALayer+YYWebImage.m */, 05F52E90CF6AB759A5E8973FB2D0A30C /* MKAnnotationView+YYWebImage.h */, BF667BB59056E36D3586F9C14DAC1F40 /* MKAnnotationView+YYWebImage.m */, 6218837B76C1C0389CDCD141C2E03DC6 /* UIButton+YYWebImage.h */, 5ED100A22D528A6B527BF6A89A4AC7D6 /* UIButton+YYWebImage.m */, D23F19B16B57D0A66373E8372683A768 /* UIImage+YYWebImage.h */, AD4CD0582C8FDBAB40F29C7202E9CCEC /* UIImage+YYWebImage.m */, 985F852E09A6DE92A217698DBE1C7A09 /* UIImageView+YYWebImage.h */, E6DD4676503B9A73639A64D61E1EA9C6 /* UIImageView+YYWebImage.m */, 31C3C0F19E4822B4EE1A9B1EEAAB58D3 /* YYImageCache.h */, C2B02D064FCD002A5F68262C9E0ABF1F /* YYImageCache.m */, BEA7E182CF4126FE52BF333A77DEC1BE /* YYWebImage.h */, 292DF8CF4A4F900FAD09AD3388FEBA16 /* YYWebImageManager.h */, 1967B907B97CEDB5AD21AA7500813370 /* YYWebImageManager.m */, 4998DE9316EBA3312011E258172289F2 /* YYWebImageOperation.h */, 171266574FF9DD54AA392259649BE115 /* YYWebImageOperation.m */, 1BBB36791DC9D1AE823083C8F6222E3D /* Support Files */, ); name = YYWebImage; path = YYWebImage; sourceTree = "<group>"; }; 4F001E8ABFE93A596AB6F8325AF771EC /* SDAutoLayout */ = { isa = PBXGroup; children = ( F52BC92DA418D92868352F4C9D911068 /* SDAutoLayout.h */, 1B9D7CEE7A93D816F6B27CEEF66AADD4 /* UITableView+SDAutoTableViewCellHeight.h */, 7C98B29E8D89A81D1387C37712D41FA2 /* UITableView+SDAutoTableViewCellHeight.m */, 2879A2CCE814DAD30804A4B382EEDCCF /* UIView+SDAutoLayout.h */, 08628DAF9A14BE82A0BE7DE1CCC30CC8 /* UIView+SDAutoLayout.m */, 6FDACCAF81B22D3F70840D189D36FA8C /* Support Files */, ); name = SDAutoLayout; path = SDAutoLayout; name = Security; sourceTree = "<group>"; }; 514529C9DFB8AE38EAB07682A2725913 /* Pods-BuWanVideo2.0 */ = { @@ -789,33 +948,48 @@ path = "Target Support Files/Pods-BuWanVideo2.0"; sourceTree = "<group>"; }; 55BC215A0FAFF3D02C75197AA95CC7AE /* AFNetworking */ = { 5F57F578425BD660FF01F7813C7044D2 /* SVProgressHUD */ = { isa = PBXGroup; children = ( 47EB02A3E16FB12FAA54FE87F6051AE3 /* AFNetworking.h */, CE12B6B30336202C5AF1FF169DD3C089 /* NSURLSession */, F89F9186512DF6BB75ADA6AAFF414C76 /* Reachability */, 87DAF71FD44127E9E6F73E7A94C4E562 /* Security */, E524D5F4CAF6C82F45E32223E38111E1 /* Serialization */, 0C814CCE5D581DB56D53061E3410B755 /* Support Files */, 47EAB055370456FC5C03160D89674965 /* UIKit */, 40C0478F247FD53447751EDB888A0EC9 /* SVIndefiniteAnimatedView.h */, 89A32B7BB601F8F442821FB96FE9AAB7 /* SVIndefiniteAnimatedView.m */, E5C6E06542E297A135D519C6804088F7 /* SVProgressAnimatedView.h */, C30D70E4FA7926DB96CD8F1E95DDD23C /* SVProgressAnimatedView.m */, F3CA00D1ED070F8F8722D5D70F4C0C01 /* SVProgressHUD.h */, 338EE01B9A8BF03B8F154654FDF37857 /* SVProgressHUD.m */, 6268E02094726CB4F270B5E5734600C1 /* SVRadialGradientLayer.h */, 6384748F502E6A77B7044817A4129FC8 /* SVRadialGradientLayer.m */, 9A7ADFB571CDCD709B3C35FFCD14979B /* Resources */, 80C49BDC34833BC1D43FD8AAD1B110F0 /* Support Files */, ); name = AFNetworking; path = AFNetworking; name = SVProgressHUD; path = SVProgressHUD; sourceTree = "<group>"; }; 68135DF19A98B7C30301DE180FF7BD85 /* YYModel */ = { 675167C66DE9119C69F6F0D8CE014EB6 /* YYImage */ = { isa = PBXGroup; children = ( 2498F9DB53639ACECAB5B262C8F72815 /* NSObject+YYModel.h */, F8F7BFE3D88FCC88A6C6C2724B3A084A /* NSObject+YYModel.m */, BF1FFAD1010C059FD96AD4DBA2DBABE3 /* YYClassInfo.h */, AC4CA4EE201E4C152503BD2E5F262390 /* YYClassInfo.m */, A926B1EBDA47D27718FEF94DA4943176 /* YYModel.h */, 8479E3C399AD79D3886F072FE2424B7B /* Support Files */, 014470781AF4760CC00E1BBE4ECF6C64 /* Core */, 8A24526F9EF164E46734C4EBDCE65CB1 /* Support Files */, 03D82A2D2EAEAC7BAE2227B55CAC5287 /* WebP */, ); name = YYModel; path = YYModel; name = YYImage; path = YYImage; sourceTree = "<group>"; }; 6CF2C2566DCD77564B6455D6FABD0D95 /* Support Files */ = { isa = PBXGroup; children = ( 87A93D738A57DCA03A5F89B311F2D61A /* SDWebImage.modulemap */, 59692B056342E1201D62D17D4BC0C0BF /* SDWebImage-dummy.m */, 3EEE4E4687D58E6A3DF38DB2C4333F1F /* SDWebImage-Info.plist */, 886CECEF031D4E8EBE4FAD2041707202 /* SDWebImage-prefix.pch */, D8F507B0AD09B94415DAFC3427A0C308 /* SDWebImage-umbrella.h */, 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */, 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDWebImage"; sourceTree = "<group>"; }; 6E802FE6713867E1EE25A7CFB10A8312 /* Frameworks */ = { @@ -828,151 +1002,147 @@ name = Frameworks; sourceTree = "<group>"; }; 6FDACCAF81B22D3F70840D189D36FA8C /* Support Files */ = { 80C49BDC34833BC1D43FD8AAD1B110F0 /* Support Files */ = { isa = PBXGroup; children = ( 567CDEF40DE8516789372AAB65C5CAA8 /* SDAutoLayout.modulemap */, 0AA915DBD189C1B6F2D5B83BB54BDBAF /* SDAutoLayout-dummy.m */, 3DC07D67AD60A466AA585FE94A23467B /* SDAutoLayout-Info.plist */, 502BC2D013649451AC55FE5C2449E662 /* SDAutoLayout-prefix.pch */, 805B652EBBA7C6765EB1F278425EAC8C /* SDAutoLayout-umbrella.h */, 863DAD78E2015EF5B32B2C0CC5DF43F6 /* SDAutoLayout.debug.xcconfig */, 54711DC9D900F4F089F990BB85B13D39 /* SDAutoLayout.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDAutoLayout"; sourceTree = "<group>"; }; 7044D9DCE03A2F0CF3E96FF1AB0C9E65 /* SDWebImage */ = { isa = PBXGroup; children = ( D37428B98D2EB5586FEAC2296D5F55D7 /* Core */, EF512E46E8EEBFCE20D0AE72094554FD /* Support Files */, ); name = SDWebImage; path = SDWebImage; sourceTree = "<group>"; }; 70AB1C263ED09CA8BAF062743A6772BB /* Products */ = { isa = PBXGroup; children = ( A4FA15D44DF6BAC7550EDEED10862AA3 /* AFNetworking.framework */, F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */, 2D24B4853EF5CE5AD7D4FA5E183BD6E2 /* SDAutoLayout.framework */, B0B214D775196BA7CA8E17E53048A493 /* SDWebImage.framework */, E97D43C46A45EE515A4DA3AF94398441 /* SVProgressHUD.framework */, 48ACF38225AF5129416A1F090F6D3286 /* YYCache.framework */, 0C6F4829D47D1826F47CDC4264F9F6A8 /* YYImage.framework */, E460D5B0416D36F66EE8EC89E5D2FA0A /* YYModel.framework */, 4FC1978206616CE319648B302B05AA8A /* YYWebImage.framework */, ); name = Products; sourceTree = "<group>"; }; 74D8EA77B48E3A9FE5DE5238C4A6B07C /* Support Files */ = { isa = PBXGroup; children = ( 00A4A55211202D4D5AF8C6AD149E2C10 /* SVProgressHUD.modulemap */, 245C98C3E82429A997870CDE1743EF72 /* SVProgressHUD-dummy.m */, 666273D4CA1CF2D3AA3D85BAB6BCDECC /* SVProgressHUD-Info.plist */, 53C8FBCF65FA1D6C097BFAEF45ABE77D /* SVProgressHUD-prefix.pch */, 0E255CBD198818C9FF2B233A9984C320 /* SVProgressHUD-umbrella.h */, 3EB9FAAC9AB63E4E32244F5166433043 /* SVProgressHUD.debug.xcconfig */, 6E3D9F5A4F34E24D12ACAB66FE2D11ED /* SVProgressHUD.release.xcconfig */, FCD4E9507A1EF5D6F511F0C033266E5E /* SVProgressHUD.modulemap */, 302868D19BAB22BF2096F7357927D9D8 /* SVProgressHUD-dummy.m */, 431F3B040054806778D2F4C904F42267 /* SVProgressHUD-Info.plist */, CA4B9B1C91E57BF82783779720252630 /* SVProgressHUD-prefix.pch */, B468F7252C4E9D17C6AB261FC977B177 /* SVProgressHUD-umbrella.h */, 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */, BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SVProgressHUD"; sourceTree = "<group>"; }; 8479E3C399AD79D3886F072FE2424B7B /* Support Files */ = { 8A24526F9EF164E46734C4EBDCE65CB1 /* Support Files */ = { isa = PBXGroup; children = ( F7AF83F8B6A491743B74656DAEB42504 /* YYModel.modulemap */, F709D93F04955DB6D32ACE07BA1AAAD7 /* YYModel-dummy.m */, 917BA836D7C13F78F6697BAD9E2DE008 /* YYModel-Info.plist */, 81BAB14F5675EB0EDA17E256692A1805 /* YYModel-prefix.pch */, 031174D1118FDCD3BD377FD2D53D95F2 /* YYModel-umbrella.h */, C26BE6D5F05DD33F43B2DA0EE4AB6A3F /* YYModel.debug.xcconfig */, 94C8DB723C58DDF55DE2F00813F6A348 /* YYModel.release.xcconfig */, 4B79D5FCA8231E9F45A5B31DC173CA1D /* YYImage.modulemap */, BE70CD7B216B7ADB16EDECCCC9898C73 /* YYImage-dummy.m */, DC6E37E1052C3C2235209A3A867F0A76 /* YYImage-Info.plist */, 7134F20032CBB294C097E37753D0B990 /* YYImage-prefix.pch */, FF757B06FC51079DE3E74976127FC490 /* YYImage-umbrella.h */, 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */, F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYModel"; path = "../Target Support Files/YYImage"; sourceTree = "<group>"; }; 87DAF71FD44127E9E6F73E7A94C4E562 /* Security */ = { 9A7ADFB571CDCD709B3C35FFCD14979B /* Resources */ = { isa = PBXGroup; children = ( 2282492AB36061E6394F5FA34E237FB7 /* AFSecurityPolicy.h */, B75FA39EDA8A66E554F9ACACA911A521 /* AFSecurityPolicy.m */, ); name = Security; sourceTree = "<group>"; }; 8BCFA56F4B07DB974FAF2B9C1E5737B4 /* Core */ = { isa = PBXGroup; children = ( D1C4E2E999566FCCE98BB31BF78222E5 /* YYAnimatedImageView.h */, F80080175678CE343D3AAB9E925DA1BA /* YYAnimatedImageView.m */, 6909FB2E568F5F37628AC8CAB84196A2 /* YYFrameImage.h */, 259861383D192B86B4CB86EC83BD6F5B /* YYFrameImage.m */, CEEAEC1C6300B4039E15D459577F4ADD /* YYImage.h */, 1DFB2015FCB3CBC32E1CD10D31A076DA /* YYImage.m */, 00EFF7FD5FFA4E8E08F4DEC390D90258 /* YYImageCoder.h */, 6FF52E3498C63283AC2D3B581BAC2018 /* YYImageCoder.m */, 4B478562C51883EA5D1453C50613D115 /* YYSpriteSheetImage.h */, E9AFCFB91D095698C39819DE34185083 /* YYSpriteSheetImage.m */, ); name = Core; sourceTree = "<group>"; }; 96EC40ECD3E31F94AE5C463450AA4D27 /* Resources */ = { isa = PBXGroup; children = ( 7BB33FD39B6EB78AA6962EADAE8327BE /* SVProgressHUD.bundle */, 87C09894B283EBD278A16FDB3EB75D77 /* SVProgressHUD.bundle */, ); name = Resources; sourceTree = "<group>"; }; 9D9D6D1F2BDAAEB9E6E376175472C81C /* UMCCommon */ = { 9E480C914401597A71DC1AE34ED232BF /* YYCache */ = { isa = PBXGroup; children = ( 10196508E9B9A0DF46A811218AC2F823 /* Frameworks */, 14E77E0ADFC61E699F43789382ED3F23 /* Support Files */, FFDD4B32DEFDD0555453D01AB11D183D /* YYCache.h */, 74D5DA7238E160253A95D43C0B5A4F2D /* YYCache.m */, 68E7E51CC244542FDB45049BFF530B12 /* YYDiskCache.h */, 00CFD934075E076A3CBB5D21C4366691 /* YYDiskCache.m */, 3BB1F0CC71FD4A9C5F0E8B09BC450A76 /* YYKVStorage.h */, 7DE56B9020EA08B1264A713571D82EAC /* YYKVStorage.m */, 86D6A440FE908DFF9E24FEA2876DDB7E /* YYMemoryCache.h */, 8D8DB7FE9CE9C64DF0DD6CF4FD7AF501 /* YYMemoryCache.m */, D68665B2406AB7B75D1B973D3FA5D81E /* Support Files */, ); name = UMCCommon; path = UMCCommon; name = YYCache; path = YYCache; sourceTree = "<group>"; }; BEE717CE994F8509DBE1537E40EE95BA /* Frameworks */ = { A79E1555EFEC8D969303E53BAB37E464 /* Frameworks */ = { isa = PBXGroup; children = ( E88CB227C198689588E72922C1880076 /* WebP.framework */, FEB39772AA9566576BC914AFC4FD3A75 /* UMCommon.framework */, ); name = Frameworks; sourceTree = "<group>"; }; BF84D06E62A4EFF34B962DA8B6A0E903 /* WebP */ = { B5E7E062B514650AD7DC87A45C450875 /* UIKit */ = { isa = PBXGroup; children = ( BEE717CE994F8509DBE1537E40EE95BA /* Frameworks */, 4EB255DCF0E56A85B9D8D475576A026C /* AFAutoPurgingImageCache.h */, 9721108E154FBB96F9B4F47956EB917D /* AFAutoPurgingImageCache.m */, 9EB0ED33B7BB6511AD60C265D69680FC /* AFImageDownloader.h */, 4E857907BC4DD146CDEB5C62D1394A78 /* AFImageDownloader.m */, A735E9C2405BD745A1E76AA06DA294A4 /* AFNetworkActivityIndicatorManager.h */, D5AFCE8DBE0A4C0EB931EF252B1E23E5 /* AFNetworkActivityIndicatorManager.m */, 0A722A647707E984C83F82B6E2A97631 /* UIActivityIndicatorView+AFNetworking.h */, 6C0B51074A42033961C10F7B0900C715 /* UIActivityIndicatorView+AFNetworking.m */, BA64E9B6956CB8B50404D1109AF2B0FC /* UIButton+AFNetworking.h */, 4F9385E5A9AB836D8EFD8F3E69233179 /* UIButton+AFNetworking.m */, BDC1252B5B77C045A32DDEBA4734C145 /* UIImage+AFNetworking.h */, B6CAB5D74635D11F0987470A7CF362E6 /* UIImageView+AFNetworking.h */, 35379D10E7453817C556E7DCA6A244B2 /* UIImageView+AFNetworking.m */, 26892DA0ECD5B12C8FD4073EAD1E9237 /* UIKit+AFNetworking.h */, 90F887DFB0B7D54B1587BCD959311BF8 /* UIProgressView+AFNetworking.h */, DB04FCC2775BBC134AA91CDE58E9CBA8 /* UIProgressView+AFNetworking.m */, C07901861F7033136A10E9E079189DE0 /* UIRefreshControl+AFNetworking.h */, 522B392BCE6392A9BA3310DA2D5CD46C /* UIRefreshControl+AFNetworking.m */, ); name = WebP; name = UIKit; sourceTree = "<group>"; }; C53E61E827B29DFC01FFF62BB6C86E8B /* Pods */ = { C337A95EA2293E94C7751090DE237DF1 /* NSURLSession */ = { isa = PBXGroup; children = ( 55BC215A0FAFF3D02C75197AA95CC7AE /* AFNetworking */, 4F001E8ABFE93A596AB6F8325AF771EC /* SDAutoLayout */, 7044D9DCE03A2F0CF3E96FF1AB0C9E65 /* SDWebImage */, F4D8FCE8670AB188B48BBFF740E8F244 /* SVProgressHUD */, 9D9D6D1F2BDAAEB9E6E376175472C81C /* UMCCommon */, DC7B877B59E55D73D44CC70C73798612 /* YYCache */, 4441D25D417EA990C274A4C51FD572E3 /* YYImage */, 68135DF19A98B7C30301DE180FF7BD85 /* YYModel */, 4B404848F15BBB63226A8E9C1A6FCBE7 /* YYWebImage */, 32152CA18EC34FE8A59B8974A4B80F6F /* AFHTTPSessionManager.h */, B4E6D390027BC38891D8B27ED3A53A2E /* AFHTTPSessionManager.m */, 18E77A78AB5601DA1A19A7E0B437E203 /* AFURLSessionManager.h */, CCC82EFB2C6B435B223A64E725C9E568 /* AFURLSessionManager.m */, ); name = Pods; name = NSURLSession; sourceTree = "<group>"; }; C58824A100680D1130CE6DC415CC01CA /* Support Files */ = { isa = PBXGroup; children = ( 567E673CD6E46A9F7459BA13BABE1B46 /* YYWebImage.modulemap */, 94AEF4F75716C93FA16447E82A7DB674 /* YYWebImage-dummy.m */, FC4BDE0C141DAE902F587415F361A4D8 /* YYWebImage-Info.plist */, 80052075A66CB61EFC5C01C3A9B556F7 /* YYWebImage-prefix.pch */, 8B7DFBFF6819BEBB3E1911F01FD4116D /* YYWebImage-umbrella.h */, AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */, 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYWebImage"; sourceTree = "<group>"; }; C59A0E810A055A4A03C9B70EA58BC03C /* Support Files */ = { isa = PBXGroup; children = ( DF3E5DE912602F028F7F75A6ABC70A43 /* AFNetworking.modulemap */, 5047A05DF375461B730C3048518084B1 /* AFNetworking-dummy.m */, 9FFE6337C733122EF8FD39AD185A6F77 /* AFNetworking-Info.plist */, A1E5E3B69E93987B632086B93782F078 /* AFNetworking-prefix.pch */, 6B618FEA1CB31965E122F833174EEF7A /* AFNetworking-umbrella.h */, 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */, A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/AFNetworking"; sourceTree = "<group>"; }; C6B5658FF107EB1BCEDCA901D3EC8F27 /* SDAutoLayout */ = { isa = PBXGroup; children = ( 8E6DB96860830D683DD062D9FC416A20 /* SDAutoLayout.h */, 7852085FC4FFA2B275BC46043D03C538 /* UITableView+SDAutoTableViewCellHeight.h */, F92BA11FB00565F6CCA04D3A274D5CF2 /* UITableView+SDAutoTableViewCellHeight.m */, 7A1CB53CA3AB4D8680DE596155FA9ED6 /* UIView+SDAutoLayout.h */, 5658EE8670AD7F46326F68C97E0965C4 /* UIView+SDAutoLayout.m */, E30CBDFC3E811F83929A96C701A0410B /* Support Files */, ); name = SDAutoLayout; path = SDAutoLayout; sourceTree = "<group>"; }; CBF6FD61B04447E7BD7E451271949FF5 /* iOS */ = { @@ -993,144 +1163,125 @@ name = iOS; sourceTree = "<group>"; }; CE12B6B30336202C5AF1FF169DD3C089 /* NSURLSession */ = { isa = PBXGroup; children = ( C980A818C139897278AF20D53841C691 /* AFHTTPSessionManager.h */, 9C30811C95136D9412C3EF9DF03E3A3B /* AFHTTPSessionManager.m */, 97B4E305A01EE1D93F4AFD5EB979439C /* AFURLSessionManager.h */, 12DABC1791D35AC91BD3C7424A966245 /* AFURLSessionManager.m */, ); name = NSURLSession; sourceTree = "<group>"; }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 6E802FE6713867E1EE25A7CFB10A8312 /* Frameworks */, C53E61E827B29DFC01FFF62BB6C86E8B /* Pods */, 70AB1C263ED09CA8BAF062743A6772BB /* Products */, 14B5654852E347080C7A3B5C05D56201 /* Pods */, 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */, F29FB9007C8660455C39667ECE3711CD /* Targets Support Files */, ); sourceTree = "<group>"; }; D37428B98D2EB5586FEAC2296D5F55D7 /* Core */ = { D68665B2406AB7B75D1B973D3FA5D81E /* Support Files */ = { isa = PBXGroup; children = ( 8650119DBDF3E87904B9B930C9397085 /* NSButton+WebCache.h */, 0D4B63FD25AF4B5C2BCC76CAC652FB39 /* NSButton+WebCache.m */, 110A1835327E1AAE666E21EDD657ADDD /* NSData+ImageContentType.h */, B4BB1AACAFD47360E043BEA2412916A9 /* NSData+ImageContentType.m */, 6AD6B595D278CCFF87534AA6EB032EED /* NSImage+WebCache.h */, 2DC1B3D624AE25D948F208A8D8F97335 /* NSImage+WebCache.m */, B8495BD79505433FCA75DF8E04C6978D /* SDAnimatedImageRep.h */, 3CEB2A242156CCF15F40B59FD917176D /* SDAnimatedImageRep.m */, DC3CAFC5CD677A3FE639DF7530A4ADCA /* SDImageCache.h */, 83596981192A82848FACA789662D9901 /* SDImageCache.m */, E1D04B1119AC447A80F102EFF06A6255 /* SDImageCacheConfig.h */, 55352ECD5DB2EC5926EEEF8B1FDF9198 /* SDImageCacheConfig.m */, 81548F4A58870D59D757ECB8B0F049EE /* SDWebImageCoder.h */, FB4E26241C34984861F0AEB98573302B /* SDWebImageCoder.m */, 7FECEB8272DD645EA9A1A1D7968AF57A /* SDWebImageCoderHelper.h */, 57F2FF1C08B7D9E885AB50FCC251178D /* SDWebImageCoderHelper.m */, 71B0F349529BA5E42ACE2AAD3502BF81 /* SDWebImageCodersManager.h */, B9C0F5AC04DFCC94CB01CA54FDCE85B0 /* SDWebImageCodersManager.m */, 6003C00DB4CAE6C5469AF4143AA7E4CC /* SDWebImageCompat.h */, 9A9463816975647F423903B984950F61 /* SDWebImageCompat.m */, 403EF6FF8AED7CA0E7D15809052F590D /* SDWebImageDownloader.h */, FAF958AAB2DF960FD4FE53CED99EF2D6 /* SDWebImageDownloader.m */, 4EB1170ADBAD2100B2D9C7EE7A734C60 /* SDWebImageDownloaderOperation.h */, 4B537F8B7DF7062DDECA3AC23EC1D207 /* SDWebImageDownloaderOperation.m */, 07A5C148E1F02F4DD148BB311E682ACB /* SDWebImageFrame.h */, 1E39C0AD688217E83A70EFDD62EA1E63 /* SDWebImageFrame.m */, A036F5A865F8074B6C533A9636BA5584 /* SDWebImageGIFCoder.h */, 37BFCA66214330116C39EFDC1DA629DE /* SDWebImageGIFCoder.m */, 2D5748AC54C2B14A346A0B51EDCA41E8 /* SDWebImageImageIOCoder.h */, C5C3B937BA90EC2B875E499C709021BD /* SDWebImageImageIOCoder.m */, AB539581931047577E5269BBB5770FA8 /* SDWebImageManager.h */, 96B11C6B0777E095949C517DFB9FA790 /* SDWebImageManager.m */, BEE119170C3A7B367B14F13E15219D97 /* SDWebImageOperation.h */, A191B06F544F9EA0767C1656E60D83D8 /* SDWebImagePrefetcher.h */, 54424E5D9F3331BC557D2BDDCA8BF965 /* SDWebImagePrefetcher.m */, AC1A4624D3723E99D5F3D4F013D24856 /* SDWebImageTransition.h */, DE03CFC1EAF91C6D650F822D59FC4A84 /* SDWebImageTransition.m */, 10995FE8BCC6F1F7D28ABAB4883A2C80 /* UIButton+WebCache.h */, 997455D8DC27099C363663C9B9A89A97 /* UIButton+WebCache.m */, 90AF2BB7F4CBFCAFFCAE46A3FFB7BBDF /* UIImage+ForceDecode.h */, EA9826C34F97624CE5824110846935FE /* UIImage+ForceDecode.m */, 9122F074E71E32095F4BA2C2BB54766F /* UIImage+GIF.h */, 4F6F65C5FBEB46F6845A207F3F2D5B91 /* UIImage+GIF.m */, 9AA96052761DA3017AFE543C2DBEE398 /* UIImage+MultiFormat.h */, 33F970A9153D219A47A799C907BDEF0D /* UIImage+MultiFormat.m */, 6BB32E9ECFF5DD428B79BC775270C01B /* UIImageView+HighlightedWebCache.h */, 1F6F5DB8F0D6862A5655573A1D4BAFAF /* UIImageView+HighlightedWebCache.m */, 9659961AA138D0C1F08083D5FE93160F /* UIImageView+WebCache.h */, F9D18BA94759BAFE5F10CB799004577D /* UIImageView+WebCache.m */, A71911B340E007EB23030810A80245EC /* UIView+WebCache.h */, C7655860107BCDC2897D49C3E995BA22 /* UIView+WebCache.m */, E15645E83B82404CE1FE18EA81F72477 /* UIView+WebCacheOperation.h */, 6D1ED0920F93C04C1267CB6D1159FCFA /* UIView+WebCacheOperation.m */, ); name = Core; sourceTree = "<group>"; }; DAFDBD8ABD1938481924E9BF2AC12AE7 /* Support Files */ = { isa = PBXGroup; children = ( 04B775FBF51628EB7F75C50232B7684B /* YYCache.modulemap */, 7AE622C260D00CD5E4191DF952109CE7 /* YYCache-dummy.m */, 661EA3140C2C4652A54C3A7EC01E8E11 /* YYCache-Info.plist */, 26982CDDC1FEE9B94BECD243692C02A0 /* YYCache-prefix.pch */, CA4ADDA4947596B669704CFDBD18111D /* YYCache-umbrella.h */, 61F4D547AD32462650D9BC3A707E2C8C /* YYCache.debug.xcconfig */, D573368EACBB1A0F70E136154886C6F1 /* YYCache.release.xcconfig */, 2401641EA88D2D3E42D792F6F1C609F5 /* YYCache.modulemap */, 8E08E8F26ED25EA439035109732AEF93 /* YYCache-dummy.m */, 05432A9AD307A07CDC115D90314C096C /* YYCache-Info.plist */, 18FDA1F0984624BF4FBFFC20F1BD72DF /* YYCache-prefix.pch */, 0985215BEFFD85D43B677A489489569D /* YYCache-umbrella.h */, 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */, 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/YYCache"; sourceTree = "<group>"; }; DC7B877B59E55D73D44CC70C73798612 /* YYCache */ = { D8267C6FA2C5F0AB339C82781F3F76C0 /* Resources */ = { isa = PBXGroup; children = ( 82AE28987B77CBBAC357CF3D18FD6380 /* YYCache.h */, 3BFF6E41A2F0125D92254AD1F6D68BDA /* YYCache.m */, 9278DF4F04872AD2664E2DF7199A12D9 /* YYDiskCache.h */, B449A3E70F510F20309AEE1F8E7338D6 /* YYDiskCache.m */, ADAFC761A5988605B4DA5DD3B4EE8536 /* YYKVStorage.h */, 705A0D7C97FACC4E5EC237F4890864AC /* YYKVStorage.m */, 6E958BABDCCA42C6600F2E2494B6EDB6 /* YYMemoryCache.h */, FA578C3DD6985D46AC7D739BDDAD1C16 /* YYMemoryCache.m */, DAFDBD8ABD1938481924E9BF2AC12AE7 /* Support Files */, 6231466E6723272781BBF15B73FD5A16 /* IQKeyboardManager.bundle */, ); name = YYCache; path = YYCache; name = Resources; sourceTree = "<group>"; }; E524D5F4CAF6C82F45E32223E38111E1 /* Serialization */ = { DA4A1FE3356F5E45637597A3B656BC01 /* Reachability */ = { isa = PBXGroup; children = ( 26892DE9B86C5EBA2A89903D33521679 /* AFURLRequestSerialization.h */, 75BFC838A48D059D000B143191621658 /* AFURLRequestSerialization.m */, 6A212A5DED1C6C2583A325804040876B /* AFURLResponseSerialization.h */, 2F9B3215106DC26FDFB291ECB372C9A7 /* AFURLResponseSerialization.m */, 8E187B581E63340ADBA5C35E8F029870 /* AFNetworkReachabilityManager.h */, F8BEBBB4D7F6F85EAD46E2A3656217DF /* AFNetworkReachabilityManager.m */, ); name = Serialization; name = Reachability; sourceTree = "<group>"; }; EF512E46E8EEBFCE20D0AE72094554FD /* Support Files */ = { DE6E09649D05347D2C1669D9C3C3E612 /* UMCCommon */ = { isa = PBXGroup; children = ( 0E962C74A956B6F921350A040E437754 /* SDWebImage.modulemap */, 9BBD2BADF01405E0910DB86D699636F1 /* SDWebImage-dummy.m */, 632A8A17A96F96D83527581790503221 /* SDWebImage-Info.plist */, 5937CF31E9A480DE9C6B03D45B79E84E /* SDWebImage-prefix.pch */, F632A28CEA762627A6ED8CA069E8419D /* SDWebImage-umbrella.h */, 1CBB711B72EF799935BD1AA34EC82468 /* SDWebImage.debug.xcconfig */, 4640C7B6757D959E7A83CEFCA2CB1A40 /* SDWebImage.release.xcconfig */, A79E1555EFEC8D969303E53BAB37E464 /* Frameworks */, E16BEAF9D86643DBB8EC0D24D63AB073 /* Support Files */, ); name = UMCCommon; path = UMCCommon; sourceTree = "<group>"; }; E16BEAF9D86643DBB8EC0D24D63AB073 /* Support Files */ = { isa = PBXGroup; children = ( 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */, 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDWebImage"; path = "../Target Support Files/UMCCommon"; sourceTree = "<group>"; }; E30CBDFC3E811F83929A96C701A0410B /* Support Files */ = { isa = PBXGroup; children = ( 0B854A205AB073BF3636BC961E846FD3 /* SDAutoLayout.modulemap */, D8CC5EA0854A065E4F729E60EAC79440 /* SDAutoLayout-dummy.m */, D436DD56400948B8D2F8E227212BEA3A /* SDAutoLayout-Info.plist */, FDA60A6242FB5E5E939171F483393755 /* SDAutoLayout-prefix.pch */, B8D1FCBF17339E0503FC0A5815A8B59B /* SDAutoLayout-umbrella.h */, 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */, 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */, ); name = "Support Files"; path = "../Target Support Files/SDAutoLayout"; sourceTree = "<group>"; }; E97A8D5F6664685C9A7712F8F8C5FCC2 /* YYWebImage */ = { isa = PBXGroup; children = ( 0A2CDDCF9D9945D00311BFC9BB8436A1 /* _YYWebImageSetter.h */, 3F761F215F2ED99F5C58244DEE41957C /* _YYWebImageSetter.m */, 436563794D25F666DCD19BE37A7BBA85 /* CALayer+YYWebImage.h */, 95917B3873C0A27B15FE95B54577B960 /* CALayer+YYWebImage.m */, 13AC94841B02E69EBF9BFE64AA3CECC1 /* MKAnnotationView+YYWebImage.h */, 628D9C339AAC48F0BCB896C9CEE8175B /* MKAnnotationView+YYWebImage.m */, 58BD1815001CC5034BB6255837AF5AE8 /* UIButton+YYWebImage.h */, 14BF4C9AB6A8950D65C93996A0A563AF /* UIButton+YYWebImage.m */, 954E821E034D1D09CB9FDFB80D9ECAB5 /* UIImage+YYWebImage.h */, B7BB8316EB15A2F1D4345C57B50D19F4 /* UIImage+YYWebImage.m */, 52E1DCA567703CCCA3596EBF6DD74067 /* UIImageView+YYWebImage.h */, 21E3942DA473328650661A64EDF91055 /* UIImageView+YYWebImage.m */, 31C94702B36F02A8FBD634FA40ECB45E /* YYImageCache.h */, 0C6D8478A9EBA8567512E695CEBB58EF /* YYImageCache.m */, 2CABF9A305C1DA818E14D2E427EE8F6E /* YYWebImage.h */, 19542EB054626AA5D4EC57E14A4CDD65 /* YYWebImageManager.h */, 44525486FDDB56A96229E7264D9AB264 /* YYWebImageManager.m */, 561FB82ED37D54725529791805C28050 /* YYWebImageOperation.h */, 4E0E7518AC47987E9CF7DF3F7ED7DA22 /* YYWebImageOperation.m */, C58824A100680D1130CE6DC415CC01CA /* Support Files */, ); name = YYWebImage; path = YYWebImage; sourceTree = "<group>"; }; F0589110DB2987ADCCF693DC4ADAD4D7 /* AFNetworking */ = { isa = PBXGroup; children = ( 2FDC0B0877D4E4A438D368B014D32B73 /* AFNetworking.h */, C337A95EA2293E94C7751090DE237DF1 /* NSURLSession */, DA4A1FE3356F5E45637597A3B656BC01 /* Reachability */, 4CE483645377B852914F927F0CDA9F93 /* Security */, FD90654436BF36C4E79EB01225BC1A3E /* Serialization */, C59A0E810A055A4A03C9B70EA58BC03C /* Support Files */, B5E7E062B514650AD7DC87A45C450875 /* UIKit */, ); name = AFNetworking; path = AFNetworking; sourceTree = "<group>"; }; F29FB9007C8660455C39667ECE3711CD /* Targets Support Files */ = { @@ -1141,36 +1292,43 @@ name = "Targets Support Files"; sourceTree = "<group>"; }; F4D8FCE8670AB188B48BBFF740E8F244 /* SVProgressHUD */ = { FD90654436BF36C4E79EB01225BC1A3E /* Serialization */ = { isa = PBXGroup; children = ( F9F3F58FCB07AA431128E53E86525582 /* SVIndefiniteAnimatedView.h */, 683B0FC67D3675B040D9DFE07FBF92CF /* SVIndefiniteAnimatedView.m */, 9C1A7AD2C0F605984A579EDB6CF18080 /* SVProgressAnimatedView.h */, 28CF94482299EF63A147A8656CCDCF80 /* SVProgressAnimatedView.m */, 64BAB9AC92FA277FDD35C926DA9BE70D /* SVProgressHUD.h */, 089F1B3B2C32FAACA75AB641A1A2CAB2 /* SVProgressHUD.m */, 5F417FCC3AFAEC005C47B6F3AC92B167 /* SVRadialGradientLayer.h */, 8D3C03CB040CFEA369343B72C9560623 /* SVRadialGradientLayer.m */, 96EC40ECD3E31F94AE5C463450AA4D27 /* Resources */, 74D8EA77B48E3A9FE5DE5238C4A6B07C /* Support Files */, C931BFAC1492FBAD2150D90870044B64 /* AFURLRequestSerialization.h */, 7E952070F6458D5354A580EB5C697A77 /* AFURLRequestSerialization.m */, DDEA2F8CBD187ED244641ECB5CAE904E /* AFURLResponseSerialization.h */, BCC14ADFC0D82391D9F788C5B3F2643D /* AFURLResponseSerialization.m */, ); name = SVProgressHUD; path = SVProgressHUD; name = Serialization; sourceTree = "<group>"; }; F89F9186512DF6BB75ADA6AAFF414C76 /* Reachability */ = { FDA41F2BA38E90C00E951D18DA60AF7F /* Support Files */ = { isa = PBXGroup; children = ( F1476DBFA9F5095C630635B7ED3AEC9D /* AFNetworkReachabilityManager.h */, 681CE234389CC9E5EB9B42C756D9F01C /* AFNetworkReachabilityManager.m */, 86CBDEBB1EF16BE5599C7B3C764E1B78 /* IQKeyboardManager.modulemap */, 4B3A615FAD585E5A40B20867999D7BE4 /* IQKeyboardManager-dummy.m */, A25D4294B555D413AB588FBA8F96B306 /* IQKeyboardManager-Info.plist */, 992112BE47ED0CD282A19A686DEC5FA8 /* IQKeyboardManager-prefix.pch */, A89505BE5DB6EB8C15D3A859D3ABC461 /* IQKeyboardManager-umbrella.h */, A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */, 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */, ); name = Reachability; name = "Support Files"; path = "../Target Support Files/IQKeyboardManager"; sourceTree = "<group>"; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 035CE4DDF8A38AEE3A51577C55EB18F9 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 6657CC5A77D6A6A366F5BA87241BC7B9 /* Pods-BuWanVideo2.0-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 2BBB19E48E5C6E19074178D75BDB5617 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -1203,6 +1361,30 @@ A06586F6C95F5672F87CCE76EC1C03DA /* UIImageView+WebCache.h in Headers */, 545A75E3EEACE311E80B97663712095C /* UIView+WebCache.h in Headers */, F7AE4667F4D56C085FB6F3D0D74F8055 /* UIView+WebCacheOperation.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; 5786AC8FA75C27DCD73F767A1BBCFF13 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 289074B2826B48FD1E713AB6947611F0 /* IQBarButtonItem.h in Headers */, B9B3A5780DDF886D16F9A708E03257B9 /* IQKeyboardManager-umbrella.h in Headers */, 1DF9E9B0DCFDA6932201D0C9C7466C14 /* IQKeyboardManager.h in Headers */, 1B4EA8CA1B9069B5CB12C5E26B3D467A /* IQKeyboardManagerConstants.h in Headers */, 07B5C8E2673AFDE7E93458F8AA3E912B /* IQKeyboardManagerConstantsInternal.h in Headers */, 5D472E3F0DD3276633EE91E830A0D29F /* IQKeyboardReturnKeyHandler.h in Headers */, 0A6D1212D37F5050068C8826C6DA8CA9 /* IQNSArray+Sort.h in Headers */, 8AF811EB2E5208003431E85B00F983DB /* IQTextView.h in Headers */, E05231BD74C57583C638BB5DE2B8DC8E /* IQTitleBarButtonItem.h in Headers */, FBAAC816A95407EFC6F55A20809A121C /* IQToolbar.h in Headers */, 6A06F5531F501AD4F245B9832B685C38 /* IQUIScrollView+Additions.h in Headers */, 19278CD21FC6C7AA64E72D72103E7527 /* IQUITextFieldView+Additions.h in Headers */, 3EB3343E3237E27BF431177ADD3A5CBF /* IQUIView+Hierarchy.h in Headers */, 4762EA920C9F9819455692BA3EE71354 /* IQUIView+IQKeyboardToolbar.h in Headers */, 614AD41B1BBFF1692CCCDA43B44C31AB /* IQUIViewController+Additions.h in Headers */, 73D83703524EE58AEEBA1052C720671E /* IQUIWindow+Hierarchy.h in Headers */, 65221D8847419CEC03519C8FA5624619 /* KeyboardManager.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1287,14 +1469,6 @@ 8BA6B74504A7404B3187C31073A5812A /* YYImage.h in Headers */, A2AE66EE8F32341D7199867E04DDB48F /* YYImageCoder.h in Headers */, FE234DE6B80B1383BF4E445CC9F4AE20 /* YYSpriteSheetImage.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; CA9ACA79FAFA0E2C89A77882BCFB75AD /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 52C0577F44619597C23A6C389EFD9114 /* Pods-BuWanVideo2.0-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1403,8 +1577,8 @@ buildRules = ( ); dependencies = ( 6F76B6A1F9AF6B1A23C1856AD1D731BB /* PBXTargetDependency */, 4DEEDDBFEBE9B10D7202B7B1888DDDDC /* PBXTargetDependency */, D263769A4110C549204FFF9C5224B019 /* PBXTargetDependency */, B988ED9708DAA014CAED486BB803CBEA /* PBXTargetDependency */, ); name = YYWebImage; productName = YYWebImage; @@ -1467,29 +1641,48 @@ }; EAD4BA19A0B2ECDDC3897988429A5452 /* Pods-BuWanVideo2.0 */ = { isa = PBXNativeTarget; buildConfigurationList = B5EC1ACEB7242A6E5DE892747F6D1EEF /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */; buildConfigurationList = 9DC28FA5F3E8F258C30D19CAC9A74AE6 /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */; buildPhases = ( CA9ACA79FAFA0E2C89A77882BCFB75AD /* Headers */, 86190D3D8A923B902FD8D33B8FE2DCAB /* Sources */, 466A5C9CC91CFB2A2D32AEDCA13EFBA3 /* Frameworks */, 8C22C0F843D187E9B12969949CA1E9ED /* Resources */, 035CE4DDF8A38AEE3A51577C55EB18F9 /* Headers */, B03DBF5B9BCB40CE35E7EE68C51D398C /* Sources */, 9D1C768C597BF82E5D67B19EA3F55A6D /* Frameworks */, C3BDBF2F1E483837C22772654603E084 /* Resources */, ); buildRules = ( ); dependencies = ( A9AD8599F86802E64C2737B79B8BEECC /* PBXTargetDependency */, 2555449BF10B3BA4AAFAD46455A8163A /* PBXTargetDependency */, CC072DF0DEBEF60805B869DF02FB735D /* PBXTargetDependency */, 846D0DB71C14B66527B3238BC449D7F2 /* PBXTargetDependency */, B89DD86563AE802A813B8B663DCF5F8E /* PBXTargetDependency */, 1917827AAA06FFCF1CCCC88384098A72 /* PBXTargetDependency */, BFE196B91C950898E50F1339ED867AFB /* PBXTargetDependency */, 118BE3829DAF70E9B9397EEC70F65074 /* PBXTargetDependency */, BDFC9DFA5FD908ED3E9D4141009C00F2 /* PBXTargetDependency */, 9D0DAC5C08DB2B6D58391A0550479C50 /* PBXTargetDependency */, 3E746F46EBD3E8386C5B99FD4A7AB8C8 /* PBXTargetDependency */, D93263E564D657742F2C0ED6BDB60695 /* PBXTargetDependency */, DE2A75E62321BB61C5230E23277A64EC /* PBXTargetDependency */, 24189D9FA6D3A75225243293563DF487 /* PBXTargetDependency */, D8232ABD0561A80E7AFC2E480FFA6BEF /* PBXTargetDependency */, 7B197EE9EDED60BDC834DEB1DED15583 /* PBXTargetDependency */, 39957D188EAC09B82BAEA96D138C9F92 /* PBXTargetDependency */, 51A00CD981678108CCB325C32FC62513 /* PBXTargetDependency */, 5E3B0189967010F54ABE8135665B9087 /* PBXTargetDependency */, ); name = "Pods-BuWanVideo2.0"; productName = "Pods-BuWanVideo2.0"; productReference = F8A3103A604070E19E1ED8A308A1980A /* Pods_BuWanVideo2_0.framework */; productType = "com.apple.product-type.framework"; }; FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */ = { isa = PBXNativeTarget; buildConfigurationList = 8B9E170D65DE8C0911C5F1164B92C88E /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */; buildPhases = ( 5786AC8FA75C27DCD73F767A1BBCFF13 /* Headers */, E85DE9D5685197F84D6F9547A6011F8B /* Sources */, 07DB1611B26D2EB8B945F931B69A52F4 /* Frameworks */, 59EE21910AE2DF3802866C7EDE059461 /* Resources */, ); buildRules = ( ); dependencies = ( ); name = IQKeyboardManager; productName = IQKeyboardManager; productReference = 98527D7196957AAB07B79E2E2AFDE23E /* IQKeyboardManager.framework */; productType = "com.apple.product-type.framework"; }; /* End PBXNativeTarget section */ @@ -1510,11 +1703,12 @@ Base, ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; productRefGroup = 70AB1C263ED09CA8BAF062743A6772BB /* Products */; productRefGroup = 2A1ADBDE0E5F7BDEBE86F193E7C10F7F /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */, FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */, EAD4BA19A0B2ECDDC3897988429A5452 /* Pods-BuWanVideo2.0 */, 03932C47FBFD347205B2F367F78E9B63 /* SDAutoLayout */, 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */, @@ -1543,6 +1737,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 59EE21910AE2DF3802866C7EDE059461 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( 03B8B3005759DA608C1306825F209CD3 /* IQKeyboardManager.bundle in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; 7BB2E885B360CCC1AEF0C191542BA06E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -1558,14 +1760,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 8C22C0F843D187E9B12969949CA1E9ED /* Resources */ = { 93339C3415F6DA4D178483BD0941DE7E /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 93339C3415F6DA4D178483BD0941DE7E /* Resources */ = { C3BDBF2F1E483837C22772654603E084 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( @@ -1643,14 +1845,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; 86190D3D8A923B902FD8D33B8FE2DCAB /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( F0C7AC07DCDEA2DFD376F4EF79BC58D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 95C4160BCA39890BC47B07560C28ACA2 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1678,6 +1872,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; B03DBF5B9BCB40CE35E7EE68C51D398C /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 6782FD484DE28206A848E06EDCE055D4 /* Pods-BuWanVideo2.0-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; D0233C648200ED130A278D7164E80914 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1697,6 +1899,27 @@ 4381C0C2775DF318539274584275BCB1 /* NSObject+YYModel.m in Sources */, C29C1BF86EA5C3DBD7AB893ACF8E2B17 /* YYClassInfo.m in Sources */, 8DD422F65B364DB9C1EAE655653561A7 /* YYModel-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; E85DE9D5685197F84D6F9547A6011F8B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 5C2234296AADE84E794617E7D34E67F6 /* IQBarButtonItem.m in Sources */, 7EDD1704F7BA5A5F0205E0723E4FC971 /* IQKeyboardManager-dummy.m in Sources */, EB93D649F6CD1CC7AE5C33A7C2DD4A92 /* IQKeyboardManager.m in Sources */, 3534E888D24CF701441C1BE77C3F8571 /* IQKeyboardReturnKeyHandler.m in Sources */, 36E5A040B5969F53739CAE7CBFD675FB /* IQNSArray+Sort.m in Sources */, C783DEBC3B894EC0FB1403F5A7B8192B /* IQTextView.m in Sources */, 9402C6C6CB65FA5044809FF0975BFE4D /* IQTitleBarButtonItem.m in Sources */, 98E7FA15BF438999C6844F3B4C5B7C7F /* IQToolbar.m in Sources */, 29CBD0C882A38F00F5D32EACDD098B72 /* IQUIScrollView+Additions.m in Sources */, 8729F89654316F693E74C3C079897D6D /* IQUITextFieldView+Additions.m in Sources */, 416BEF9978A1BD50545717CAA92F476A /* IQUIView+Hierarchy.m in Sources */, 233B5AF506E5E01A5F1795421178189A /* IQUIView+IQKeyboardToolbar.m in Sources */, 082BCD8FE038428839036EA7081C0667 /* IQUIViewController+Additions.m in Sources */, 40DBC045F76B6E92E5C751110CE9C869 /* IQUIWindow+Hierarchy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1737,112 +1960,84 @@ /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 118BE3829DAF70E9B9397EEC70F65074 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYModel; target = 84B44807A12996D487A4A591A481D6A0 /* YYModel */; targetProxy = A8330E6DA3342D0209B46298A8E174E7 /* PBXContainerItemProxy */; }; 1917827AAA06FFCF1CCCC88384098A72 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = 3D77959C7B2E87CDFDE22026460AED43 /* PBXContainerItemProxy */; }; 2555449BF10B3BA4AAFAD46455A8163A /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDAutoLayout; target = 03932C47FBFD347205B2F367F78E9B63 /* SDAutoLayout */; targetProxy = E884AADB40CC339F9F7AA63363277864 /* PBXContainerItemProxy */; }; 4DEEDDBFEBE9B10D7202B7B1888DDDDC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 83DD6FE8DD5BAE2099906603BBA1CDC8 /* PBXContainerItemProxy */; }; 6F76B6A1F9AF6B1A23C1856AD1D731BB /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = 0652055C329CAAC6BF28F8DC9284F62B /* PBXContainerItemProxy */; }; 846D0DB71C14B66527B3238BC449D7F2 /* PBXTargetDependency */ = { 24189D9FA6D3A75225243293563DF487 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SVProgressHUD; target = 1C8D67D8B72D6BA42CCEDB648537A340 /* SVProgressHUD */; targetProxy = ABFA14192D282A22EEC33837203FCE68 /* PBXContainerItemProxy */; targetProxy = 39010B3C4CD3E161A5359EC62F062B3F /* PBXContainerItemProxy */; }; A9AD8599F86802E64C2737B79B8BEECC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AFNetworking; target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; targetProxy = 31B1F19A02C9D98B04019FEC450A6DF2 /* PBXContainerItemProxy */; }; B89DD86563AE802A813B8B663DCF5F8E /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCCommon; target = 6F6B630FA5213AB083E7CEF1F986FE44 /* UMCCommon */; targetProxy = 9029FDC7BEC59240364049C5BD4F579F /* PBXContainerItemProxy */; }; BDFC9DFA5FD908ED3E9D4141009C00F2 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYWebImage; target = 488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */; targetProxy = ABD4F84489C589D667C3DA21C04B226F /* PBXContainerItemProxy */; }; BFE196B91C950898E50F1339ED867AFB /* PBXTargetDependency */ = { 39957D188EAC09B82BAEA96D138C9F92 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 547CA5DA1C33B6B8C609306B71BD860C /* PBXContainerItemProxy */; targetProxy = 39E01E082225420D2B27661D102B08AF /* PBXContainerItemProxy */; }; CC072DF0DEBEF60805B869DF02FB735D /* PBXTargetDependency */ = { 3E746F46EBD3E8386C5B99FD4A7AB8C8 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = IQKeyboardManager; target = FBA456CB50E371584C11231929A0971E /* IQKeyboardManager */; targetProxy = AA8F9DC2302FB0FC551F2944853C3486 /* PBXContainerItemProxy */; }; 51A00CD981678108CCB325C32FC62513 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYModel; target = 84B44807A12996D487A4A591A481D6A0 /* YYModel */; targetProxy = 6C1CF5D3986704BF19F9EB59D987C6C0 /* PBXContainerItemProxy */; }; 5E3B0189967010F54ABE8135665B9087 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYWebImage; target = 488E8C830C5A5694EE916251B9ADAADA /* YYWebImage */; targetProxy = 70722B4466CCEF7C48301488CA06D47E /* PBXContainerItemProxy */; }; 7B197EE9EDED60BDC834DEB1DED15583 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = A7725E3D9598E58FD15784801553CCF0 /* PBXContainerItemProxy */; }; 9D0DAC5C08DB2B6D58391A0550479C50 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = AFNetworking; target = 0130B3724283586C0E9D2A112D4F2AA1 /* AFNetworking */; targetProxy = 0104E26FD175BEA255C6856FF19FB484 /* PBXContainerItemProxy */; }; B988ED9708DAA014CAED486BB803CBEA /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYImage; target = 822E44240F2922DAB12018A6B649BD19 /* YYImage */; targetProxy = 8CF7F27808F8A5A006B38502A5B1B60F /* PBXContainerItemProxy */; }; D263769A4110C549204FFF9C5224B019 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = YYCache; target = CFDAE6EB02F58B9A37CADCF439AE6082 /* YYCache */; targetProxy = A7164C3D5176976AE6A9386AC65256AB /* PBXContainerItemProxy */; }; D8232ABD0561A80E7AFC2E480FFA6BEF /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UMCCommon; target = 6F6B630FA5213AB083E7CEF1F986FE44 /* UMCCommon */; targetProxy = 195BE46DBF20E99C879F0694E2C05E7C /* PBXContainerItemProxy */; }; D93263E564D657742F2C0ED6BDB60695 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDAutoLayout; target = 03932C47FBFD347205B2F367F78E9B63 /* SDAutoLayout */; targetProxy = 54F6CEA4803E4F0979EC311FBCA8B3A1 /* PBXContainerItemProxy */; }; DE2A75E62321BB61C5230E23277A64EC /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = SDWebImage; target = 3847153A6E5EEFB86565BA840768F429 /* SDWebImage */; targetProxy = 689EB0A0DDE3D55A22A3C6C3E1EFE62C /* PBXContainerItemProxy */; targetProxy = 15F5EB11DB9B4325A6F80F975F9A85BA /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 113CB3FF936CFC829F48A973B645E150 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; 12D4D3868F1FCA559103B98ED53AB23F /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 4640C7B6757D959E7A83CEFCA2CB1A40 /* SDWebImage.release.xcconfig */; baseConfigurationReference = 06617545769B7AFFDF1D2D8CAD0E3C40 /* SDWebImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1873,7 +2068,7 @@ }; 194603DF5485109ACD936C057344FF81 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 6E3D9F5A4F34E24D12ACAB66FE2D11ED /* SVProgressHUD.release.xcconfig */; baseConfigurationReference = BCB58A5382C1F631BEE128C111FDFE77 /* SVProgressHUD.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1904,7 +2099,7 @@ }; 27B6379B9915AD2C6F2A997650D7DF13 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = C26BE6D5F05DD33F43B2DA0EE4AB6A3F /* YYModel.debug.xcconfig */; baseConfigurationReference = 0863BA2E7625437CCF2AD822AADBD14C /* YYModel.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1934,7 +2129,7 @@ }; 2D43B37FA711C27FD315A9C48853AAAF /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = C0FDE9DA859C326ED19D483AF38BDD78 /* AFNetworking.debug.xcconfig */; baseConfigurationReference = 535FF7AEEA0A877AB813020B3A5C2513 /* AFNetworking.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1962,9 +2157,40 @@ }; name = Debug; }; 3155BB214D8F72ED584CCA607CF159B9 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 0E84503CC7AC8803383E34A33700A149 /* IQKeyboardManager.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; PRODUCT_MODULE_NAME = IQKeyboardManager; PRODUCT_NAME = IQKeyboardManager; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; 49DAD7AE978B8E537BEE5C948BAE3B3D /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 1CBB711B72EF799935BD1AA34EC82468 /* SDWebImage.debug.xcconfig */; baseConfigurationReference = 633F9A5C6929420CE95700768F073EFB /* SDWebImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1994,7 +2220,7 @@ }; 4EB37250CA71F238C789C4789DEBEE89 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 61F4D547AD32462650D9BC3A707E2C8C /* YYCache.debug.xcconfig */; baseConfigurationReference = 9DF4DE629098FF15B403BE56D0856DA2 /* YYCache.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2022,42 +2248,9 @@ }; name = Debug; }; 511764AC902871BB1D1B4C652AFC0DDD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; 5C36AB9A48012D034A98928714B6BBB3 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 3EB9FAAC9AB63E4E32244F5166433043 /* SVProgressHUD.debug.xcconfig */; baseConfigurationReference = 11A9F777D6CAF09F8A2527AD18805629 /* SVProgressHUD.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2087,7 +2280,7 @@ }; 5DE43F541F0E9DE3CDE10DEDB5D201DD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = F9EDE8A71F8751B2B740F4FAEFA1ADA0 /* UMCCommon.debug.xcconfig */; baseConfigurationReference = 6BB1FC1CA63AAA77E98E85CF3431087F /* UMCCommon.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -2101,7 +2294,7 @@ }; 65175E750F9EBF6DB95E3BFA342FD1EA /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 94C8DB723C58DDF55DE2F00813F6A348 /* YYModel.release.xcconfig */; baseConfigurationReference = D991275587332C3DC6F5543A13528CED /* YYModel.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2132,7 +2325,7 @@ }; 6ED57EC6B3C5EF40DA5463348AA87A00 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 54711DC9D900F4F089F990BB85B13D39 /* SDAutoLayout.release.xcconfig */; baseConfigurationReference = 019EC0F5541FE58CA6A668CA8E90E0BE /* SDAutoLayout.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2163,7 +2356,7 @@ }; 7E688DFE999385AC21BF781CDC4BBCB0 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 087FEBFF0DAAC636E025FF25ECF3569E /* AFNetworking.release.xcconfig */; baseConfigurationReference = A2FD65B3495B0AD2D2D16197F3D9075A /* AFNetworking.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2194,7 +2387,7 @@ }; 8D99FE2CA257BE4B65C10DB77E7ABE1A /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 6FB9E56DB5BC8D81CC60E34C94B26F2A /* YYImage.release.xcconfig */; baseConfigurationReference = F8623FC9861C8ABEBE1730FC61A1111F /* YYImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2225,7 +2418,7 @@ }; 958F41B792A69E986C72E6915B52FCCC /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 1148079642F8F2244A6A077E1584588E /* YYWebImage.debug.xcconfig */; baseConfigurationReference = AE035C5592517EF0C4EC5D5F6316EE0D /* YYWebImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2255,7 +2448,7 @@ }; 9FB93EDA5C47372550BF6F21599F8582 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 07D077E1B21B15E749023D615A7878AF /* YYImage.debug.xcconfig */; baseConfigurationReference = 4ACA87A555BA903C17DE1C8766674ECA /* YYImage.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2285,7 +2478,7 @@ }; A7C58B22381068D2332BDADE8ACE88F0 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = D573368EACBB1A0F70E136154886C6F1 /* YYCache.release.xcconfig */; baseConfigurationReference = 4600196AA2978695F863C06E8FA7A756 /* YYCache.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2316,7 +2509,7 @@ }; B849CC5F92FCF52405DC94008BA6BA6F /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 659B5F014CB3717763C3D0991CBA9B65 /* UMCCommon.release.xcconfig */; baseConfigurationReference = 1538EA8172164A02CB89A3BCA93D91E1 /* UMCCommon.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; @@ -2328,6 +2521,36 @@ VALIDATE_PRODUCT = YES; }; name = Release; }; BB8A92E1706E027197AAD12021E99C37 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = A6D1D2633FCA2C2E14D4DCE781C73340 /* IQKeyboardManager.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; GCC_PREFIX_HEADER = "Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch"; INFOPLIST_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap"; PRODUCT_MODULE_NAME = IQKeyboardManager; PRODUCT_NAME = IQKeyboardManager; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; C352469741B3A74ED19BE4F809ED9D7A /* Debug */ = { isa = XCBuildConfiguration; @@ -2395,9 +2618,76 @@ }; name = Debug; }; E38C12B01A34663D5A5A7C1E1CC5DD89 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = BF74743C7A7A330AC3A1799C8DAE8332 /* Pods-BuWanVideo2.0.release.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; E4D706C07034B41F27D8775A84846C7F /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 7BA7BEF589982FD9C8B376EA994796DE /* Pods-BuWanVideo2.0.debug.xcconfig */; buildSettings = { ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; INFOPLIST_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.modulemap"; OTHER_LDFLAGS = ""; OTHER_LIBTOOLFLAGS = ""; PODS_ROOT = "$(SRCROOT)"; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; SDKROOT = iphoneos; SKIP_INSTALL = YES; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Debug; }; EBDAB536D8F4CDC1F80C7C6E3DC8BC97 /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = 863DAD78E2015EF5B32B2C0CC5DF43F6 /* SDAutoLayout.debug.xcconfig */; baseConfigurationReference = 1E2C2F03B2242AE5D58CC619ABB1933E /* SDAutoLayout.debug.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2489,7 +2779,7 @@ }; F806DBC5F662DDA3B2B3A5D129A0906B /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = 2A2A055FFA758CF75B49CB7F7D947308 /* YYWebImage.release.xcconfig */; baseConfigurationReference = 30F94E2C298157954AAB33D5AF87FD1A /* YYWebImage.release.xcconfig */; buildSettings = { ARCHS = "$(ARCHS_STANDARD)"; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -2584,6 +2874,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 8B9E170D65DE8C0911C5F1164B92C88E /* Build configuration list for PBXNativeTarget "IQKeyboardManager" */ = { isa = XCConfigurationList; buildConfigurations = ( BB8A92E1706E027197AAD12021E99C37 /* Debug */, 3155BB214D8F72ED584CCA607CF159B9 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 8C46CA93012AD85D7A7C8ADF7C5B068C /* Build configuration list for PBXNativeTarget "YYCache" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -2593,11 +2892,11 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; B5EC1ACEB7242A6E5DE892747F6D1EEF /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */ = { 9DC28FA5F3E8F258C30D19CAC9A74AE6 /* Build configuration list for PBXNativeTarget "Pods-BuWanVideo2.0" */ = { isa = XCConfigurationList; buildConfigurations = ( 511764AC902871BB1D1B4C652AFC0DDD /* Debug */, 113CB3FF936CFC829F48A973B645E150 /* Release */, E4D706C07034B41F27D8775A84846C7F /* Debug */, E38C12B01A34663D5A5A7C1E1CC5DD89 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; Pods/Pods.xcodeproj/xcuserdata/aeline.xcuserdatad/xcschemes/IQKeyboardManager.xcscheme
New file @@ -0,0 +1,60 @@ <?xml version="1.0" encoding="UTF-8"?> <Scheme LastUpgradeVersion = "1100" version = "1.3"> <BuildAction parallelizeBuildables = "YES" buildImplicitDependencies = "YES"> <BuildActionEntries> <BuildActionEntry buildForAnalyzing = "YES" buildForTesting = "YES" buildForRunning = "YES" buildForProfiling = "YES" buildForArchiving = "YES"> <BuildableReference BuildableIdentifier = "primary" BlueprintIdentifier = "FBA456CB50E371584C11231929A0971E" BuildableName = "IQKeyboardManager.framework" BlueprintName = "IQKeyboardManager" ReferencedContainer = "container:Pods.xcodeproj"> </BuildableReference> </BuildActionEntry> </BuildActionEntries> </BuildAction> <TestAction selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" buildConfiguration = "Debug"> <AdditionalOptions> </AdditionalOptions> </TestAction> <LaunchAction selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" buildConfiguration = "Debug" allowLocationSimulation = "YES"> <AdditionalOptions> </AdditionalOptions> </LaunchAction> <ProfileAction savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES" buildConfiguration = "Release" shouldUseLaunchSchemeArgsEnv = "YES"> </ProfileAction> <AnalyzeAction buildConfiguration = "Debug"> </AnalyzeAction> <ArchiveAction buildConfiguration = "Release" revealArchiveInOrganizer = "YES"> </ArchiveAction> </Scheme> Pods/Pods.xcodeproj/xcuserdata/aeline.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -9,6 +9,11 @@ <key>isShown</key> <false/> </dict> <key>IQKeyboardManager.xcscheme</key> <dict> <key>isShown</key> <false/> </dict> <key>Pods-BuWanVideo2.0.xcscheme</key> <dict> <key>isShown</key> Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-Info.plist
File was renamed from Pods/Target Support Files/SVProgressHUD/Info.plist @@ -15,7 +15,7 @@ <key>CFBundlePackageType</key> <string>FMWK</string> <key>CFBundleShortVersionString</key> <string>2.1.2</string> <string>3.3.7</string> <key>CFBundleSignature</key> <string>????</string> <key>CFBundleVersion</key> Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-dummy.m
New file @@ -0,0 +1,5 @@ #import <Foundation/Foundation.h> @interface PodsDummy_IQKeyboardManager : NSObject @end @implementation PodsDummy_IQKeyboardManager @end Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-prefix.pch
New file @@ -0,0 +1,12 @@ #ifdef __OBJC__ #import <UIKit/UIKit.h> #else #ifndef FOUNDATION_EXPORT #if defined(__cplusplus) #define FOUNDATION_EXPORT extern "C" #else #define FOUNDATION_EXPORT extern #endif #endif #endif Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager-umbrella.h
New file @@ -0,0 +1,32 @@ #ifdef __OBJC__ #import <UIKit/UIKit.h> #else #ifndef FOUNDATION_EXPORT #if defined(__cplusplus) #define FOUNDATION_EXPORT extern "C" #else #define FOUNDATION_EXPORT extern #endif #endif #endif #import "IQNSArray+Sort.h" #import "IQUIScrollView+Additions.h" #import "IQUITextFieldView+Additions.h" #import "IQUIView+Hierarchy.h" #import "IQUIViewController+Additions.h" #import "IQUIWindow+Hierarchy.h" #import "IQKeyboardManagerConstants.h" #import "IQKeyboardManagerConstantsInternal.h" #import "IQKeyboardManager.h" #import "IQKeyboardReturnKeyHandler.h" #import "IQTextView.h" #import "IQBarButtonItem.h" #import "IQTitleBarButtonItem.h" #import "IQToolbar.h" #import "IQUIView+IQKeyboardToolbar.h" #import "KeyboardManager.h" FOUNDATION_EXPORT double IQKeyboardManagerVersionNumber; FOUNDATION_EXPORT const unsigned char IQKeyboardManagerVersionString[]; Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.debug.xcconfig
New file @@ -0,0 +1,11 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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 PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.modulemap
New file @@ -0,0 +1,6 @@ framework module IQKeyboardManager { umbrella header "IQKeyboardManager-umbrella.h" export * module * { export * } } Pods/Target Support Files/IQKeyboardManager/IQKeyboardManager.release.xcconfig
New file @@ -0,0 +1,11 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 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 PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} SKIP_INSTALL = YES USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-acknowledgements.markdown
@@ -24,6 +24,34 @@ THE SOFTWARE. ## IQKeyboardManager IQKeyboardManager license ========================= The MIT License (MIT) Copyright (c) 2013-14 Iftekhar Qurashi 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) Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-acknowledgements.plist
@@ -43,6 +43,40 @@ </dict> <dict> <key>FooterText</key> <string>IQKeyboardManager license ========================= The MIT License (MIT) Copyright (c) 2013-14 Iftekhar Qurashi 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. </string> <key>License</key> <string>MIT</string> <key>Title</key> <string>IQKeyboardManager</string> <key>Type</key> <string>PSGroupSpecifier</string> </dict> <dict> <key>FooterText</key> <string>The MIT License (MIT) Copyright (c) 2015 GSD_iOS Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0-frameworks.sh
@@ -176,6 +176,7 @@ if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework" @@ -186,6 +187,7 @@ fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/AFNetworking/AFNetworking.framework" install_framework "${BUILT_PRODUCTS_DIR}/IQKeyboardManager/IQKeyboardManager.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDAutoLayout/SDAutoLayout.framework" install_framework "${BUILT_PRODUCTS_DIR}/SDWebImage/SDWebImage.framework" install_framework "${BUILT_PRODUCTS_DIR}/SVProgressHUD/SVProgressHUD.framework" Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.debug.xcconfig
@@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/YYImage/Vendor" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/YYImage/Vendor" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout/SDAutoLayout.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache/YYCache.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage/YYImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage/YYWebImage.framework/Headers" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout/SDAutoLayout.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache/YYCache.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage/YYImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage/YYWebImage.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"z" -framework "AFNetworking" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SDAutoLayout" -framework "SDWebImage" -framework "SVProgressHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMCommon" -framework "YYCache" -framework "YYImage" -framework "YYModel" -framework "YYWebImage" OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"z" -framework "AFNetworking" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "IQKeyboardManager" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SDAutoLayout" -framework "SDWebImage" -framework "SVProgressHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMCommon" -framework "YYCache" -framework "YYImage" -framework "YYModel" -framework "YYWebImage" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. Pods/Target Support Files/Pods-BuWanVideo2.0/Pods-BuWanVideo2.0.release.xcconfig
@@ -1,9 +1,9 @@ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/YYImage/Vendor" FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage" "${PODS_ROOT}/UMCCommon" "${PODS_ROOT}/YYImage/Vendor" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout/SDAutoLayout.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache/YYCache.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage/YYImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage/YYWebImage.framework/Headers" HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/AFNetworking/AFNetworking.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/IQKeyboardManager/IQKeyboardManager.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDAutoLayout/SDAutoLayout.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/SVProgressHUD/SVProgressHUD.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYCache/YYCache.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYImage/YYImage.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYModel/YYModel.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/YYWebImage/YYWebImage.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"z" -framework "AFNetworking" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SDAutoLayout" -framework "SDWebImage" -framework "SVProgressHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMCommon" -framework "YYCache" -framework "YYImage" -framework "YYModel" -framework "YYWebImage" OTHER_LDFLAGS = $(inherited) -ObjC -l"sqlite3" -l"z" -framework "AFNetworking" -framework "Accelerate" -framework "AssetsLibrary" -framework "CoreFoundation" -framework "CoreGraphics" -framework "CoreTelephony" -framework "Foundation" -framework "IQKeyboardManager" -framework "ImageIO" -framework "MobileCoreServices" -framework "QuartzCore" -framework "SDAutoLayout" -framework "SDWebImage" -framework "SVProgressHUD" -framework "Security" -framework "SystemConfiguration" -framework "UIKit" -framework "UMCommon" -framework "YYCache" -framework "YYImage" -framework "YYModel" -framework "YYWebImage" PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) PODS_PODFILE_DIR_PATH = ${SRCROOT}/. Pods/Target Support Files/SVProgressHUD/SVProgressHUD-dummy.mold mode 100755 new mode 100644
Pods/Target Support Files/SVProgressHUD/SVProgressHUD.modulemapold mode 100755 new mode 100644
Pods/Target Support Files/SVProgressHUD/SVProgressHUD.xcconfig
File was deleted