Commit c333764b by xuning

初始化项目

parents
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 56;
objects = {
/* Begin PBXBuildFile section */
799DF0502B6A81B300680907 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 799DF0442B6A81B200680907 /* Assets.xcassets */; };
799DF0522B6A81B300680907 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0462B6A81B200680907 /* SceneDelegate.m */; };
799DF0532B6A81B300680907 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 799DF0472B6A81B200680907 /* LaunchScreen.storyboard */; };
799DF0542B6A81B300680907 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 799DF0492B6A81B200680907 /* Main.storyboard */; };
799DF0552B6A81B300680907 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF04B2B6A81B200680907 /* main.m */; };
799DF0562B6A81B300680907 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF04C2B6A81B200680907 /* AppDelegate.m */; };
799DF0572B6A81B300680907 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 799DF04D2B6A81B200680907 /* Info.plist */; };
799DF05D2B6A81FE00680907 /* kfw_ios_fastserviceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0592B6A81FD00680907 /* kfw_ios_fastserviceTests.m */; };
799DF05E2B6A81FE00680907 /* kfw_ios_fastserviceUITestsLaunchTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF05B2B6A81FE00680907 /* kfw_ios_fastserviceUITestsLaunchTests.m */; };
799DF05F2B6A81FE00680907 /* kfw_ios_fastserviceUITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF05C2B6A81FE00680907 /* kfw_ios_fastserviceUITests.m */; };
799DF0762B6A89F600680907 /* BRPlaceholderTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0652B6A89F600680907 /* BRPlaceholderTextView.m */; };
799DF0772B6A89F600680907 /* NSString+Unicode.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0682B6A89F600680907 /* NSString+Unicode.m */; };
799DF0782B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF06C2B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.m */; };
799DF0792B6A89F600680907 /* ImageCenterButton.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF06E2B6A89F600680907 /* ImageCenterButton.m */; };
799DF07A2B6A89F600680907 /* WRNavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0712B6A89F600680907 /* WRNavigationBar.m */; };
799DF07B2B6A89F600680907 /* WRCustomNavigationBar.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0742B6A89F600680907 /* WRCustomNavigationBar.m */; };
799DF07F2B6A8A7D00680907 /* XVBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF07E2B6A8A7D00680907 /* XVBaseViewController.m */; };
799DF0822B6A8AAB00680907 /* XVBaseNavController.m in Sources */ = {isa = PBXBuildFile; fileRef = 799DF0812B6A8AAB00680907 /* XVBaseNavController.m */; };
AC2BF7981FBA0C80BF53A5F4 /* Pods_kfw_ios_fastserviceTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A4072D05115889085C413DF2 /* Pods_kfw_ios_fastserviceTests.framework */; };
E97FEEFD536405A32A8BF508 /* Pods_kfw_ios_fastservice.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D36EA9942EA48E4DDDA52F86 /* Pods_kfw_ios_fastservice.framework */; };
EA99BAB1BCD1D4D06B638F8B /* Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2078327AD938B071BFEB07C3 /* Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
799DF0262B6A818000680907 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 799DF0022B6A817C00680907 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 799DF0092B6A817C00680907;
remoteInfo = kfw_ios_fastservice;
};
799DF0302B6A818000680907 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 799DF0022B6A817C00680907 /* Project object */;
proxyType = 1;
remoteGlobalIDString = 799DF0092B6A817C00680907;
remoteInfo = kfw_ios_fastservice;
};
/* End PBXContainerItemProxy section */
/* Begin PBXFileReference section */
0D6E8C9B4C92FF385D12F21E /* Pods-kfw_ios_fastservice.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastservice.debug.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice.debug.xcconfig"; sourceTree = "<group>"; };
152B35D589D790B18FF9FE7F /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.release.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.release.xcconfig"; sourceTree = "<group>"; };
2078327AD938B071BFEB07C3 /* Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
57E49B30D21DB81774881E5B /* Pods-kfw_ios_fastserviceTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastserviceTests.release.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastserviceTests/Pods-kfw_ios_fastserviceTests.release.xcconfig"; sourceTree = "<group>"; };
6B3B931219CF86E0F9127201 /* Pods-kfw_ios_fastserviceTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastserviceTests.debug.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastserviceTests/Pods-kfw_ios_fastserviceTests.debug.xcconfig"; sourceTree = "<group>"; };
799DF00A2B6A817C00680907 /* kfw_ios_fastservice.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = kfw_ios_fastservice.app; sourceTree = BUILT_PRODUCTS_DIR; };
799DF0252B6A818000680907 /* kfw_ios_fastserviceTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = kfw_ios_fastserviceTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
799DF02F2B6A818000680907 /* kfw_ios_fastserviceUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = kfw_ios_fastserviceUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
799DF0432B6A81B200680907 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
799DF0442B6A81B200680907 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
799DF0462B6A81B200680907 /* SceneDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
799DF0482B6A81B200680907 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
799DF04A2B6A81B200680907 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
799DF04B2B6A81B200680907 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
799DF04C2B6A81B200680907 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
799DF04D2B6A81B200680907 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
799DF04F2B6A81B200680907 /* SceneDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
799DF0592B6A81FD00680907 /* kfw_ios_fastserviceTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = kfw_ios_fastserviceTests.m; sourceTree = "<group>"; };
799DF05B2B6A81FE00680907 /* kfw_ios_fastserviceUITestsLaunchTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = kfw_ios_fastserviceUITestsLaunchTests.m; sourceTree = "<group>"; };
799DF05C2B6A81FE00680907 /* kfw_ios_fastserviceUITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = kfw_ios_fastserviceUITests.m; sourceTree = "<group>"; };
799DF0642B6A89F600680907 /* BRPlaceholderTextView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BRPlaceholderTextView.h; sourceTree = "<group>"; };
799DF0652B6A89F600680907 /* BRPlaceholderTextView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = BRPlaceholderTextView.m; sourceTree = "<group>"; };
799DF0682B6A89F600680907 /* NSString+Unicode.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+Unicode.m"; sourceTree = "<group>"; };
799DF0692B6A89F600680907 /* NSString+Unicode.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+Unicode.h"; sourceTree = "<group>"; };
799DF06B2B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "UINavigationController+FDFullscreenPopGesture.h"; sourceTree = "<group>"; };
799DF06C2B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "UINavigationController+FDFullscreenPopGesture.m"; sourceTree = "<group>"; };
799DF06E2B6A89F600680907 /* ImageCenterButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ImageCenterButton.m; sourceTree = "<group>"; };
799DF06F2B6A89F600680907 /* ImageCenterButton.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageCenterButton.h; sourceTree = "<group>"; };
799DF0712B6A89F600680907 /* WRNavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WRNavigationBar.m; sourceTree = "<group>"; };
799DF0722B6A89F600680907 /* WRCustomNavigationBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WRCustomNavigationBar.h; sourceTree = "<group>"; };
799DF0732B6A89F600680907 /* WRNavigationBar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WRNavigationBar.h; sourceTree = "<group>"; };
799DF0742B6A89F600680907 /* WRCustomNavigationBar.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WRCustomNavigationBar.m; sourceTree = "<group>"; };
799DF07D2B6A8A7D00680907 /* XVBaseViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVBaseViewController.h; sourceTree = "<group>"; };
799DF07E2B6A8A7D00680907 /* XVBaseViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVBaseViewController.m; sourceTree = "<group>"; };
799DF0802B6A8AAB00680907 /* XVBaseNavController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = XVBaseNavController.h; sourceTree = "<group>"; };
799DF0812B6A8AAB00680907 /* XVBaseNavController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = XVBaseNavController.m; sourceTree = "<group>"; };
A4072D05115889085C413DF2 /* Pods_kfw_ios_fastserviceTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_kfw_ios_fastserviceTests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
BEDE164C5FD11A49DCAC3B75 /* Pods-kfw_ios_fastservice.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastservice.release.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice.release.xcconfig"; sourceTree = "<group>"; };
CD19931E139D0A18ACE6521C /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.debug.xcconfig"; path = "Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.debug.xcconfig"; sourceTree = "<group>"; };
D36EA9942EA48E4DDDA52F86 /* Pods_kfw_ios_fastservice.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_kfw_ios_fastservice.framework; sourceTree = BUILT_PRODUCTS_DIR; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
799DF0072B6A817C00680907 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
E97FEEFD536405A32A8BF508 /* Pods_kfw_ios_fastservice.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF0222B6A818000680907 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
AC2BF7981FBA0C80BF53A5F4 /* Pods_kfw_ios_fastserviceTests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF02C2B6A818000680907 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
EA99BAB1BCD1D4D06B638F8B /* Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1131A49850CE00A8E2DD25FB /* Pods */ = {
isa = PBXGroup;
children = (
0D6E8C9B4C92FF385D12F21E /* Pods-kfw_ios_fastservice.debug.xcconfig */,
BEDE164C5FD11A49DCAC3B75 /* Pods-kfw_ios_fastservice.release.xcconfig */,
CD19931E139D0A18ACE6521C /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.debug.xcconfig */,
152B35D589D790B18FF9FE7F /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.release.xcconfig */,
6B3B931219CF86E0F9127201 /* Pods-kfw_ios_fastserviceTests.debug.xcconfig */,
57E49B30D21DB81774881E5B /* Pods-kfw_ios_fastserviceTests.release.xcconfig */,
);
path = Pods;
sourceTree = "<group>";
};
799DF0012B6A817C00680907 = {
isa = PBXGroup;
children = (
799DF0422B6A81B200680907 /* FastService */,
799DF0582B6A81FD00680907 /* FastServiceTests */,
799DF05A2B6A81FE00680907 /* FastServiceUITests */,
799DF00B2B6A817C00680907 /* Products */,
1131A49850CE00A8E2DD25FB /* Pods */,
F96BC1AB343441F57C7E3DB6 /* Frameworks */,
);
sourceTree = "<group>";
};
799DF00B2B6A817C00680907 /* Products */ = {
isa = PBXGroup;
children = (
799DF00A2B6A817C00680907 /* kfw_ios_fastservice.app */,
799DF0252B6A818000680907 /* kfw_ios_fastserviceTests.xctest */,
799DF02F2B6A818000680907 /* kfw_ios_fastserviceUITests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
799DF0422B6A81B200680907 /* FastService */ = {
isa = PBXGroup;
children = (
799DF0752B6A89F600680907 /* Base */,
799DF0622B6A89F600680907 /* Common */,
799DF0612B6A891200680907 /* Supporting Files */,
);
path = FastService;
sourceTree = "<group>";
};
799DF0582B6A81FD00680907 /* FastServiceTests */ = {
isa = PBXGroup;
children = (
799DF0592B6A81FD00680907 /* kfw_ios_fastserviceTests.m */,
);
path = FastServiceTests;
sourceTree = "<group>";
};
799DF05A2B6A81FE00680907 /* FastServiceUITests */ = {
isa = PBXGroup;
children = (
799DF05B2B6A81FE00680907 /* kfw_ios_fastserviceUITestsLaunchTests.m */,
799DF05C2B6A81FE00680907 /* kfw_ios_fastserviceUITests.m */,
);
path = FastServiceUITests;
sourceTree = "<group>";
};
799DF0612B6A891200680907 /* Supporting Files */ = {
isa = PBXGroup;
children = (
799DF0472B6A81B200680907 /* LaunchScreen.storyboard */,
799DF0492B6A81B200680907 /* Main.storyboard */,
799DF0432B6A81B200680907 /* AppDelegate.h */,
799DF04C2B6A81B200680907 /* AppDelegate.m */,
799DF04F2B6A81B200680907 /* SceneDelegate.h */,
799DF0462B6A81B200680907 /* SceneDelegate.m */,
799DF04B2B6A81B200680907 /* main.m */,
799DF04D2B6A81B200680907 /* Info.plist */,
799DF0442B6A81B200680907 /* Assets.xcassets */,
);
name = "Supporting Files";
sourceTree = "<group>";
};
799DF0622B6A89F600680907 /* Common */ = {
isa = PBXGroup;
children = (
799DF0632B6A89F600680907 /* Categpry */,
799DF0662B6A89F600680907 /* Libs */,
);
path = Common;
sourceTree = "<group>";
};
799DF0632B6A89F600680907 /* Categpry */ = {
isa = PBXGroup;
children = (
799DF0642B6A89F600680907 /* BRPlaceholderTextView.h */,
799DF0652B6A89F600680907 /* BRPlaceholderTextView.m */,
);
path = Categpry;
sourceTree = "<group>";
};
799DF0662B6A89F600680907 /* Libs */ = {
isa = PBXGroup;
children = (
799DF0672B6A89F600680907 /* NSString+Unicode */,
799DF06A2B6A89F600680907 /* FDFullscreenPopGesture */,
799DF06D2B6A89F600680907 /* UIButton+EdgeInsets */,
799DF0702B6A89F600680907 /* WRNavigationBar */,
);
path = Libs;
sourceTree = "<group>";
};
799DF0672B6A89F600680907 /* NSString+Unicode */ = {
isa = PBXGroup;
children = (
799DF0682B6A89F600680907 /* NSString+Unicode.m */,
799DF0692B6A89F600680907 /* NSString+Unicode.h */,
);
path = "NSString+Unicode";
sourceTree = "<group>";
};
799DF06A2B6A89F600680907 /* FDFullscreenPopGesture */ = {
isa = PBXGroup;
children = (
799DF06B2B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.h */,
799DF06C2B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.m */,
);
path = FDFullscreenPopGesture;
sourceTree = "<group>";
};
799DF06D2B6A89F600680907 /* UIButton+EdgeInsets */ = {
isa = PBXGroup;
children = (
799DF06E2B6A89F600680907 /* ImageCenterButton.m */,
799DF06F2B6A89F600680907 /* ImageCenterButton.h */,
);
path = "UIButton+EdgeInsets";
sourceTree = "<group>";
};
799DF0702B6A89F600680907 /* WRNavigationBar */ = {
isa = PBXGroup;
children = (
799DF0712B6A89F600680907 /* WRNavigationBar.m */,
799DF0722B6A89F600680907 /* WRCustomNavigationBar.h */,
799DF0732B6A89F600680907 /* WRNavigationBar.h */,
799DF0742B6A89F600680907 /* WRCustomNavigationBar.m */,
);
path = WRNavigationBar;
sourceTree = "<group>";
};
799DF0752B6A89F600680907 /* Base */ = {
isa = PBXGroup;
children = (
799DF07C2B6A8A0800680907 /* Controller */,
);
path = Base;
sourceTree = "<group>";
};
799DF07C2B6A8A0800680907 /* Controller */ = {
isa = PBXGroup;
children = (
799DF07D2B6A8A7D00680907 /* XVBaseViewController.h */,
799DF07E2B6A8A7D00680907 /* XVBaseViewController.m */,
799DF0802B6A8AAB00680907 /* XVBaseNavController.h */,
799DF0812B6A8AAB00680907 /* XVBaseNavController.m */,
);
path = Controller;
sourceTree = "<group>";
};
F96BC1AB343441F57C7E3DB6 /* Frameworks */ = {
isa = PBXGroup;
children = (
D36EA9942EA48E4DDDA52F86 /* Pods_kfw_ios_fastservice.framework */,
2078327AD938B071BFEB07C3 /* Pods_kfw_ios_fastservice_kfw_ios_fastserviceUITests.framework */,
A4072D05115889085C413DF2 /* Pods_kfw_ios_fastserviceTests.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
799DF0092B6A817C00680907 /* kfw_ios_fastservice */ = {
isa = PBXNativeTarget;
buildConfigurationList = 799DF0392B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastservice" */;
buildPhases = (
E5FAFF47556D813CA48A5A7A /* [CP] Check Pods Manifest.lock */,
799DF0062B6A817C00680907 /* Sources */,
799DF0072B6A817C00680907 /* Frameworks */,
799DF0082B6A817C00680907 /* Resources */,
55D1AECA1900552E3BEA5886 /* [CP] Embed Pods Frameworks */,
558BE517D0F5929631A7405C /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
);
name = kfw_ios_fastservice;
productName = kfw_ios_fastservice;
productReference = 799DF00A2B6A817C00680907 /* kfw_ios_fastservice.app */;
productType = "com.apple.product-type.application";
};
799DF0242B6A818000680907 /* kfw_ios_fastserviceTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 799DF03C2B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastserviceTests" */;
buildPhases = (
7432D4182F35EB60E5154AA3 /* [CP] Check Pods Manifest.lock */,
799DF0212B6A818000680907 /* Sources */,
799DF0222B6A818000680907 /* Frameworks */,
799DF0232B6A818000680907 /* Resources */,
);
buildRules = (
);
dependencies = (
799DF0272B6A818000680907 /* PBXTargetDependency */,
);
name = kfw_ios_fastserviceTests;
productName = kfw_ios_fastserviceTests;
productReference = 799DF0252B6A818000680907 /* kfw_ios_fastserviceTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
799DF02E2B6A818000680907 /* kfw_ios_fastserviceUITests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 799DF03F2B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastserviceUITests" */;
buildPhases = (
1FD03B9D27C414C63304ED77 /* [CP] Check Pods Manifest.lock */,
799DF02B2B6A818000680907 /* Sources */,
799DF02C2B6A818000680907 /* Frameworks */,
799DF02D2B6A818000680907 /* Resources */,
311B33492E3270D779B08193 /* [CP] Embed Pods Frameworks */,
C563CF665C625E512997A2A1 /* [CP] Copy Pods Resources */,
);
buildRules = (
);
dependencies = (
799DF0312B6A818000680907 /* PBXTargetDependency */,
);
name = kfw_ios_fastserviceUITests;
productName = kfw_ios_fastserviceUITests;
productReference = 799DF02F2B6A818000680907 /* kfw_ios_fastserviceUITests.xctest */;
productType = "com.apple.product-type.bundle.ui-testing";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
799DF0022B6A817C00680907 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = 1;
CLASSPREFIX = XV;
LastUpgradeCheck = 1430;
ORGANIZATIONNAME = FastService;
TargetAttributes = {
799DF0092B6A817C00680907 = {
CreatedOnToolsVersion = 14.3;
};
799DF0242B6A818000680907 = {
CreatedOnToolsVersion = 14.3;
TestTargetID = 799DF0092B6A817C00680907;
};
799DF02E2B6A818000680907 = {
CreatedOnToolsVersion = 14.3;
TestTargetID = 799DF0092B6A817C00680907;
};
};
};
buildConfigurationList = 799DF0052B6A817C00680907 /* Build configuration list for PBXProject "FastService" */;
compatibilityVersion = "Xcode 14.0";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 799DF0012B6A817C00680907;
productRefGroup = 799DF00B2B6A817C00680907 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
799DF0092B6A817C00680907 /* kfw_ios_fastservice */,
799DF0242B6A818000680907 /* kfw_ios_fastserviceTests */,
799DF02E2B6A818000680907 /* kfw_ios_fastserviceUITests */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
799DF0082B6A817C00680907 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
799DF0502B6A81B300680907 /* Assets.xcassets in Resources */,
799DF0542B6A81B300680907 /* Main.storyboard in Resources */,
799DF0532B6A81B300680907 /* LaunchScreen.storyboard in Resources */,
799DF0572B6A81B300680907 /* Info.plist in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF0232B6A818000680907 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF02D2B6A818000680907 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
1FD03B9D27C414C63304ED77 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
311B33492E3270D779B08193 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
558BE517D0F5929631A7405C /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-resources.sh\"\n";
showEnvVarsInLog = 0;
};
55D1AECA1900552E3BEA5886 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-frameworks-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Embed Pods Frameworks";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-frameworks-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice/Pods-kfw_ios_fastservice-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
7432D4182F35EB60E5154AA3 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-kfw_ios_fastserviceTests-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
C563CF665C625E512997A2A1 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-resources-${CONFIGURATION}-input-files.xcfilelist",
);
name = "[CP] Copy Pods Resources";
outputFileListPaths = (
"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-resources-${CONFIGURATION}-output-files.xcfilelist",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests/Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests-resources.sh\"\n";
showEnvVarsInLog = 0;
};
E5FAFF47556D813CA48A5A7A /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-kfw_ios_fastservice-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
799DF0062B6A817C00680907 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
799DF05D2B6A81FE00680907 /* kfw_ios_fastserviceTests.m in Sources */,
799DF07F2B6A8A7D00680907 /* XVBaseViewController.m in Sources */,
799DF0822B6A8AAB00680907 /* XVBaseNavController.m in Sources */,
799DF0762B6A89F600680907 /* BRPlaceholderTextView.m in Sources */,
799DF05F2B6A81FE00680907 /* kfw_ios_fastserviceUITests.m in Sources */,
799DF0782B6A89F600680907 /* UINavigationController+FDFullscreenPopGesture.m in Sources */,
799DF0792B6A89F600680907 /* ImageCenterButton.m in Sources */,
799DF0522B6A81B300680907 /* SceneDelegate.m in Sources */,
799DF0562B6A81B300680907 /* AppDelegate.m in Sources */,
799DF05E2B6A81FE00680907 /* kfw_ios_fastserviceUITestsLaunchTests.m in Sources */,
799DF0552B6A81B300680907 /* main.m in Sources */,
799DF0772B6A89F600680907 /* NSString+Unicode.m in Sources */,
799DF07A2B6A89F600680907 /* WRNavigationBar.m in Sources */,
799DF07B2B6A89F600680907 /* WRCustomNavigationBar.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF0212B6A818000680907 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
799DF02B2B6A818000680907 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
799DF0272B6A818000680907 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 799DF0092B6A817C00680907 /* kfw_ios_fastservice */;
targetProxy = 799DF0262B6A818000680907 /* PBXContainerItemProxy */;
};
799DF0312B6A818000680907 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = 799DF0092B6A817C00680907 /* kfw_ios_fastservice */;
targetProxy = 799DF0302B6A818000680907 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
799DF0472B6A81B200680907 /* LaunchScreen.storyboard */ = {
isa = PBXVariantGroup;
children = (
799DF0482B6A81B200680907 /* Base */,
);
name = LaunchScreen.storyboard;
sourceTree = "<group>";
};
799DF0492B6A81B200680907 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
799DF04A2B6A81B200680907 /* Base */,
);
name = Main.storyboard;
sourceTree = "<group>";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
799DF0372B6A818000680907 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
799DF0382B6A818000680907 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
799DF03A2B6A818000680907 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 0D6E8C9B4C92FF385D12F21E /* Pods-kfw_ios_fastservice.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = kfw_ios_fastservice/Info.plist;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationPortrait";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.bendiyun.fastservice;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
799DF03B2B6A818000680907 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = BEDE164C5FD11A49DCAC3B75 /* Pods-kfw_ios_fastservice.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_FILE = kfw_ios_fastservice/Info.plist;
INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
INFOPLIST_KEY_UIMainStoryboardFile = Main;
INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationPortrait";
INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = UIInterfaceOrientationPortrait;
IPHONEOS_DEPLOYMENT_TARGET = 12.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = com.bendiyun.fastservice;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = YES;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
799DF03D2B6A818000680907 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 6B3B931219CF86E0F9127201 /* Pods-kfw_ios_fastserviceTests.debug.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bendiyun.fastservice.kfw-ios-fastserviceTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kfw_ios_fastservice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/kfw_ios_fastservice";
};
name = Debug;
};
799DF03E2B6A818000680907 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 57E49B30D21DB81774881E5B /* Pods-kfw_ios_fastserviceTests.release.xcconfig */;
buildSettings = {
BUNDLE_LOADER = "$(TEST_HOST)";
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 16.4;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bendiyun.fastservice.kfw-ios-fastserviceTests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/kfw_ios_fastservice.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/kfw_ios_fastservice";
};
name = Release;
};
799DF0402B6A818000680907 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = CD19931E139D0A18ACE6521C /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.debug.xcconfig */;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bendiyun.fastservice.kfw-ios-fastserviceUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = kfw_ios_fastservice;
};
name = Debug;
};
799DF0412B6A818000680907 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 152B35D589D790B18FF9FE7F /* Pods-kfw_ios_fastservice-kfw_ios_fastserviceUITests.release.xcconfig */;
buildSettings = {
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEVELOPMENT_TEAM = S3SN9ALHA9;
GENERATE_INFOPLIST_FILE = YES;
MARKETING_VERSION = 1.0;
PRODUCT_BUNDLE_IDENTIFIER = "com.bendiyun.fastservice.kfw-ios-fastserviceUITests";
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_EMIT_LOC_STRINGS = NO;
TARGETED_DEVICE_FAMILY = "1,2";
TEST_TARGET_NAME = kfw_ios_fastservice;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
799DF0052B6A817C00680907 /* Build configuration list for PBXProject "FastService" */ = {
isa = XCConfigurationList;
buildConfigurations = (
799DF0372B6A818000680907 /* Debug */,
799DF0382B6A818000680907 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
799DF0392B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastservice" */ = {
isa = XCConfigurationList;
buildConfigurations = (
799DF03A2B6A818000680907 /* Debug */,
799DF03B2B6A818000680907 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
799DF03C2B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastserviceTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
799DF03D2B6A818000680907 /* Debug */,
799DF03E2B6A818000680907 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
799DF03F2B6A818000680907 /* Build configuration list for PBXNativeTarget "kfw_ios_fastserviceUITests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
799DF0402B6A818000680907 /* Debug */,
799DF0412B6A818000680907 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = 799DF0022B6A817C00680907 /* Project object */;
}
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>kfw_ios_fastservice.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>16</integer>
</dict>
</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "group:FastService.xcodeproj">
</FileRef>
<FileRef
location = "group:Pods/Pods.xcodeproj">
</FileRef>
</Workspace>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>
//
// AppDelegate.h
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
//
#import <UIKit/UIKit.h>
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@end
//
// AppDelegate.m
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
//
#import "AppDelegate.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
return YES;
}
#pragma mark - UISceneSession lifecycle
- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
// Called when a new scene session is being created.
// Use this method to select a configuration to create the new scene with.
return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
}
- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
// Called when the user discards a scene session.
// If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
// Use this method to release any resources that were specific to the discarded scenes, as they will not return.
}
@end
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"images" : [
{
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="53" y="375"/>
</scene>
</scenes>
</document>
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="BYZ-38-t0r">
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="tne-QT-ifu">
<objects>
<viewController id="BYZ-38-t0r" customClass="ViewController" customModuleProvider="" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
</objects>
</scene>
</scenes>
</document>
//
// XVBaseNavController.h
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface XVBaseNavController : UINavigationController
@end
NS_ASSUME_NONNULL_END
//
// XVBaseNavController.m
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import "XVBaseNavController.h"
@interface XVBaseNavController ()
@end
@implementation XVBaseNavController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// XVBaseViewController.h
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN
@interface XVBaseViewController : UIViewController
@end
NS_ASSUME_NONNULL_END
//
// XVBaseViewController.m
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
// Copyright © 2024 FastService. All rights reserved.
//
#import "XVBaseViewController.h"
@interface XVBaseViewController ()
@end
@implementation XVBaseViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
//
// PlaceholderTextView.h
// SaleHelper
//
// Created by gitBurning on 14/12/8.
// Copyright (c) 2014年 Burning_git. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface BRPlaceholderTextView : UITextView
@property(copy,nonatomic) NSString *placeholder;
@property(strong,nonatomic) NSIndexPath * indexPath;
//最大长度设置
@property(assign,nonatomic) NSInteger maxTextLength;
//更新高度的时候
@property(assign,nonatomic) float updateHeight;
/**
* 增加text 长度限制
*
* @param maxLength <#maxLength description#>
* @param limit <#limit description#>
*/
-(void)addMaxTextLengthWithMaxLength:(NSInteger)maxLength andEvent:(void(^)(BRPlaceholderTextView*text))limit;
/**
* 开始编辑 的 回调
*
* @param begin <#begin description#>
*/
-(void)addTextViewBeginEvent:(void(^)(BRPlaceholderTextView*text))begin;
/**
* 编辑 的 回调
*
* @param change <#begin description#>
*/
-(void)addTextViewDidChangeEvent:(void(^)(BRPlaceholderTextView*text))change;
/**
* 结束编辑 的 回调
*
* @param End <#begin description#>
*/
-(void)addTextViewEndEvent:(void(^)(BRPlaceholderTextView*text))End;
/**
* 设置Placeholder 颜色
*
* @param color <#color description#>
*/
-(void)setPlaceholderColor:(UIColor*)color;
/**
* 设置Placeholder 字体
*
* @param font <#font description#>
*/
-(void)setPlaceholderFont:(UIFont*)font;
/**
* 设置透明度
*
* @param opacity <#opacity description#>
*/
-(void)setPlaceholderOpacity:(float)opacity;
@end
//
// PlaceholderTextView.m
// SaleHelper
//
// Created by gitBurning on 14/12/8.
// Copyright (c) 2014年 Burning_git. All rights reserved.
//
#import "BRPlaceholderTextView.h"
#define kTopY 7.0
#define kLeftX 5.0
@interface BRPlaceholderTextView()<UITextViewDelegate>
@property(strong,nonatomic) UIColor *placeholder_color;
@property(strong,nonatomic) UIFont * placeholder_font;
/**
* 显示 Placeholder
*/
@property(strong,nonatomic,readonly) UILabel *PlaceholderLabel;
@property(assign,nonatomic) float placeholdeWidth;
@property(copy,nonatomic) id eventBlock;
@property(copy,nonatomic) id BeginBlock;
@property(copy,nonatomic) id ChangeBlock;
@property(copy,nonatomic) id EndBlock;
@end
@implementation BRPlaceholderTextView
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
#pragma mark - life cycle
- (id) initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
[self awakeFromNib];
}
return self;
}
- (void)awakeFromNib {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(DidChange:) name:UITextViewTextDidChangeNotification object:self];
//UITextViewTextDidBeginEditingNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewBeginNoti:) name:UITextViewTextDidBeginEditingNotification object:self];
//UITextViewTextDidEndEditingNotification
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textViewEndNoti:) name:UITextViewTextDidEndEditingNotification object:self];
float left=kLeftX,top=kTopY,hegiht=30;
self.placeholdeWidth=CGRectGetWidth(self.frame)-2*left;
_PlaceholderLabel=[[UILabel alloc] initWithFrame:CGRectMake(left, top
, _placeholdeWidth, hegiht)];
_PlaceholderLabel.numberOfLines=0;
_PlaceholderLabel.lineBreakMode=NSLineBreakByCharWrapping|NSLineBreakByWordWrapping;
[self addSubview:_PlaceholderLabel];
[self defaultConfig];
}
-(void)layoutSubviews
{
float left=kLeftX,top=kTopY,hegiht=self.bounds.size.height;
self.placeholdeWidth=CGRectGetWidth(self.frame)-2*left;
CGRect frame=_PlaceholderLabel.frame;
frame.origin.x=left;
frame.origin.y=top;
frame.size.height=hegiht;
frame.size.width=self.placeholdeWidth;
_PlaceholderLabel.frame=frame;
[_PlaceholderLabel sizeToFit];
}
-(void)dealloc{
[_PlaceholderLabel removeFromSuperview];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark - System Delegate
#pragma mark - custom Delegate
#pragma mark - Event response
-(void)defaultConfig
{
self.placeholder_color = [UIColor lightGrayColor];
self.placeholder_font = [UIFont systemFontOfSize:14];
self.maxTextLength=1000;
self.layoutManager.allowsNonContiguousLayout=NO;
}
-(void)addMaxTextLengthWithMaxLength:(NSInteger)maxLength andEvent:(void (^)(BRPlaceholderTextView *text))limit
{
if (maxLength>0) {
_maxTextLength=maxLength;
}
if (limit) {
_eventBlock=limit;
}
}
- (void)addTextViewDidChangeEvent:(void (^)(BRPlaceholderTextView *))change {
_ChangeBlock = change;
}
-(void)addTextViewBeginEvent:(void (^)(BRPlaceholderTextView *))begin{
_BeginBlock=begin;
}
-(void)addTextViewEndEvent:(void (^)(BRPlaceholderTextView *))End{
_EndBlock=End;
}
-(void)setUpdateHeight:(float)updateHeight{
CGRect frame=self.frame;
frame.size.height=updateHeight;
self.frame=frame;
_updateHeight=updateHeight;
}
//供外部使用的 api
-(void)setPlaceholderFont:(UIFont *)font
{
self.placeholder_font=font;
}
-(void)setPlaceholderColor:(UIColor *)color
{
self.placeholder_color=color;
}
-(void)setPlaceholderOpacity:(float)opacity
{
if (opacity<0) {
opacity=1;
}
self.PlaceholderLabel.layer.opacity=opacity;
}
#pragma mark - Noti Event
-(void)textViewBeginNoti:(NSNotification*)noti{
if (_BeginBlock) {
void(^begin)(BRPlaceholderTextView*text)=_BeginBlock;
begin(self);
}
}
-(void)textViewEndNoti:(NSNotification*)noti{
if (_EndBlock) {
void(^end)(BRPlaceholderTextView*text)=_EndBlock;
end(self);
}
}
-(void)DidChange:(NSNotification*)noti{
if (self.placeholder.length == 0 || [self.placeholder isEqualToString:@""]) {
_PlaceholderLabel.hidden=YES;
}
if (self.text.length > 0) {
_PlaceholderLabel.hidden=YES;
}
else{
_PlaceholderLabel.hidden=NO;
}
NSString *lang = [[self.nextResponder textInputMode] primaryLanguage]; // 键盘输入模式
if ([lang isEqualToString:@"zh-Hans"]) { // 简体中文输入,包括简体拼音,健体五笔,简体手写
UITextRange *selectedRange = [self markedTextRange];
//获取高亮部分
UITextPosition *position = [self positionFromPosition:selectedRange.start offset:0];
// 没有高亮选择的字,则对已输入的文字进行字数统计和限制
if (!position) {
if (self.text.length > self.maxTextLength) {
self.text = [self.text substringToIndex:self.maxTextLength];
}
}
// 有高亮选择的字符串,则暂不对文字进行统计和限制
else{
}
}
// 中文输入法以外的直接对其统计限制即可,不考虑其他语种情况
else{
if (self.text.length > self.maxTextLength) {
self.text = [ self.text substringToIndex:self.maxTextLength];
}
}
if (_eventBlock && self.text.length > self.maxTextLength) {
void (^limint)(BRPlaceholderTextView*text) =_eventBlock;
limint(self);
}
if (_ChangeBlock && self.text.length <= self.maxTextLength) {
void(^change)(BRPlaceholderTextView*text)=_ChangeBlock;
change(self);
}
}
#pragma mark - private method
+(float)boundingRectWithSize:(CGSize)size withLabel:(NSString *)label withFont:(UIFont *)font{
NSDictionary *attribute = @{NSFontAttributeName:font};
// CGSize retSize;
CGSize retSize = [label boundingRectWithSize:size
options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
attributes:attribute
context:nil].size;
return retSize.height;
}
#pragma mark - getters and Setters
-(void)setText:(NSString *)tex{
if (tex.length>0) {
_PlaceholderLabel.hidden=YES;
}
[super setText:tex];
}
-(void)setPlaceholder:(NSString *)placeholder{
if (placeholder.length == 0 || [placeholder isEqualToString:@""]) {
_PlaceholderLabel.hidden=YES;
}
else
{
_PlaceholderLabel.text=placeholder;
_placeholder=placeholder;
// float height= [BRPlaceholderTextView boundingRectWithSize:CGSizeMake(_placeholdeWidth, MAXFLOAT) withLabel:_placeholder withFont:_PlaceholderLabel.font];
// if (height>CGRectGetHeight(_PlaceholderLabel.frame) && height< CGRectGetHeight(self.frame)) {
//
// CGRect frame=_PlaceholderLabel.frame;
// frame.size.height=height;
// _PlaceholderLabel.frame=frame;
//
// }
}
}
-(void)setPlaceholder_font:(UIFont *)placeholder_font
{
_placeholder_font=placeholder_font;
_PlaceholderLabel.font=placeholder_font;
}
-(void)setPlaceholder_color:(UIColor *)placeholder_color
{
_placeholder_color=placeholder_color;
_PlaceholderLabel.textColor=placeholder_color;
}
@end
// The MIT License (MIT)
//
// Copyright (c) 2015-2016 forkingdog ( https://github.com/forkingdog )
//
// 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>
/// "UINavigation+FDFullscreenPopGesture" extends UINavigationController's swipe-
/// to-pop behavior in iOS 7+ by supporting fullscreen pan gesture. Instead of
/// screen edge, you can now swipe from any place on the screen and the onboard
/// interactive pop transition works seamlessly.
///
/// Adding the implementation file of this category to your target will
/// automatically patch UINavigationController with this feature.
@interface UINavigationController (FDFullscreenPopGesture)
/// The gesture recognizer that actually handles interactive pop.
@property (nonatomic, strong, readonly) UIPanGestureRecognizer *fd_fullscreenPopGestureRecognizer;
/// A view controller is able to control navigation bar's appearance by itself,
/// rather than a global way, checking "fd_prefersNavigationBarHidden" property.
/// Default to YES, disable it if you don't want so.
@property (nonatomic, assign) BOOL fd_viewControllerBasedNavigationBarAppearanceEnabled;
@end
/// Allows any view controller to disable interactive pop gesture, which might
/// be necessary when the view controller itself handles pan gesture in some
/// cases.
@interface UIViewController (FDFullscreenPopGesture)
/// Whether the interactive pop gesture is disabled when contained in a navigation
/// stack.
@property (nonatomic, assign) BOOL fd_interactivePopDisabled;
/// Indicate this view controller prefers its navigation bar hidden or not,
/// checked when view controller based navigation bar's appearance is enabled.
/// Default to NO, bars are more likely to show.
@property (nonatomic, assign) BOOL fd_prefersNavigationBarHidden;
/// Max allowed initial distance to left edge when you begin the interactive pop
/// gesture. 0 by default, which means it will ignore this limit.
@property (nonatomic, assign) CGFloat fd_interactivePopMaxAllowedInitialDistanceToLeftEdge;
@end
// The MIT License (MIT)
//
// Copyright (c) 2015-2016 forkingdog ( https://github.com/forkingdog )
//
// 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 "UINavigationController+FDFullscreenPopGesture.h"
#import <objc/runtime.h>
@interface _FDFullscreenPopGestureRecognizerDelegate : NSObject <UIGestureRecognizerDelegate>
@property (nonatomic, weak) UINavigationController *navigationController;
@end
@implementation _FDFullscreenPopGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer
{
// Ignore when no view controller is pushed into the navigation stack.
if (self.navigationController.viewControllers.count <= 1) {
return NO;
}
// Ignore when the active view controller doesn't allow interactive pop.
UIViewController *topViewController = self.navigationController.viewControllers.lastObject;
if (topViewController.fd_interactivePopDisabled) {
return NO;
}
// Ignore when the beginning location is beyond max allowed initial distance to left edge.
CGPoint beginningLocation = [gestureRecognizer locationInView:gestureRecognizer.view];
CGFloat maxAllowedInitialDistance = topViewController.fd_interactivePopMaxAllowedInitialDistanceToLeftEdge;
if (maxAllowedInitialDistance > 0 && beginningLocation.x > maxAllowedInitialDistance) {
return NO;
}
// Ignore pan gesture when the navigation controller is currently in transition.
if ([[self.navigationController valueForKey:@"_isTransitioning"] boolValue]) {
return NO;
}
// Prevent calling the handler when the gesture begins in an opposite direction.
CGPoint translation = [gestureRecognizer translationInView:gestureRecognizer.view];
BOOL isLeftToRight = [UIApplication sharedApplication].userInterfaceLayoutDirection == UIUserInterfaceLayoutDirectionLeftToRight;
CGFloat multiplier = isLeftToRight ? 1 : - 1;
if ((translation.x * multiplier) <= 0) {
return NO;
}
return YES;
}
@end
typedef void (^_FDViewControllerWillAppearInjectBlock)(UIViewController *viewController, BOOL animated);
@interface UIViewController (FDFullscreenPopGesturePrivate)
@property (nonatomic, copy) _FDViewControllerWillAppearInjectBlock fd_willAppearInjectBlock;
@end
@implementation UIViewController (FDFullscreenPopGesturePrivate)
+ (void)load
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Method viewWillAppear_originalMethod = class_getInstanceMethod(self, @selector(viewWillAppear:));
Method viewWillAppear_swizzledMethod = class_getInstanceMethod(self, @selector(fd_viewWillAppear:));
method_exchangeImplementations(viewWillAppear_originalMethod, viewWillAppear_swizzledMethod);
Method viewWillDisappear_originalMethod = class_getInstanceMethod(self, @selector(viewWillDisappear:));
Method viewWillDisappear_swizzledMethod = class_getInstanceMethod(self, @selector(fd_viewWillDisappear:));
method_exchangeImplementations(viewWillDisappear_originalMethod, viewWillDisappear_swizzledMethod);
});
}
- (void)fd_viewWillAppear:(BOOL)animated
{
// Forward to primary implementation.
[self fd_viewWillAppear:animated];
if (self.fd_willAppearInjectBlock) {
self.fd_willAppearInjectBlock(self, animated);
}
}
- (void)fd_viewWillDisappear:(BOOL)animated
{
// Forward to primary implementation.
[self fd_viewWillDisappear:animated];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
UIViewController *viewController = self.navigationController.viewControllers.lastObject;
if (viewController && !viewController.fd_prefersNavigationBarHidden) {
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
});
}
- (_FDViewControllerWillAppearInjectBlock)fd_willAppearInjectBlock
{
return objc_getAssociatedObject(self, _cmd);
}
- (void)setFd_willAppearInjectBlock:(_FDViewControllerWillAppearInjectBlock)block
{
objc_setAssociatedObject(self, @selector(fd_willAppearInjectBlock), block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}
@end
@implementation UINavigationController (FDFullscreenPopGesture)
+ (void)load
{
// Inject "-pushViewController:animated:"
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
SEL originalSelector = @selector(pushViewController:animated:);
SEL swizzledSelector = @selector(fd_pushViewController:animated:);
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
BOOL success = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));
if (success) {
class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
});
}
- (void)fd_pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (![self.interactivePopGestureRecognizer.view.gestureRecognizers containsObject:self.fd_fullscreenPopGestureRecognizer]) {
// Add our own gesture recognizer to where the onboard screen edge pan gesture recognizer is attached to.
[self.interactivePopGestureRecognizer.view addGestureRecognizer:self.fd_fullscreenPopGestureRecognizer];
// Forward the gesture events to the private handler of the onboard gesture recognizer.
NSArray *internalTargets = [self.interactivePopGestureRecognizer valueForKey:@"targets"];
id internalTarget = [internalTargets.firstObject valueForKey:@"target"];
SEL internalAction = NSSelectorFromString(@"handleNavigationTransition:");
self.fd_fullscreenPopGestureRecognizer.delegate = self.fd_popGestureRecognizerDelegate;
[self.fd_fullscreenPopGestureRecognizer addTarget:internalTarget action:internalAction];
// Disable the onboard gesture recognizer.
self.interactivePopGestureRecognizer.enabled = NO;
}
// Handle perferred navigation bar appearance.
[self fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:viewController];
// Forward to primary implementation.
if (![self.viewControllers containsObject:viewController]) {
[self fd_pushViewController:viewController animated:animated];
}
}
- (void)fd_setupViewControllerBasedNavigationBarAppearanceIfNeeded:(UIViewController *)appearingViewController
{
if (!self.fd_viewControllerBasedNavigationBarAppearanceEnabled) {
return;
}
__weak typeof(self) weakSelf = self;
_FDViewControllerWillAppearInjectBlock block = ^(UIViewController *viewController, BOOL animated) {
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf setNavigationBarHidden:viewController.fd_prefersNavigationBarHidden animated:animated];
}
};
// Setup will appear inject block to appearing view controller.
// Setup disappearing view controller as well, because not every view controller is added into
// stack by pushing, maybe by "-setViewControllers:".
appearingViewController.fd_willAppearInjectBlock = block;
UIViewController *disappearingViewController = self.viewControllers.lastObject;
if (disappearingViewController && !disappearingViewController.fd_willAppearInjectBlock) {
disappearingViewController.fd_willAppearInjectBlock = block;
}
}
- (_FDFullscreenPopGestureRecognizerDelegate *)fd_popGestureRecognizerDelegate
{
_FDFullscreenPopGestureRecognizerDelegate *delegate = objc_getAssociatedObject(self, _cmd);
if (!delegate) {
delegate = [[_FDFullscreenPopGestureRecognizerDelegate alloc] init];
delegate.navigationController = self;
objc_setAssociatedObject(self, _cmd, delegate, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return delegate;
}
- (UIPanGestureRecognizer *)fd_fullscreenPopGestureRecognizer
{
UIPanGestureRecognizer *panGestureRecognizer = objc_getAssociatedObject(self, _cmd);
if (!panGestureRecognizer) {
panGestureRecognizer = [[UIPanGestureRecognizer alloc] init];
panGestureRecognizer.maximumNumberOfTouches = 1;
objc_setAssociatedObject(self, _cmd, panGestureRecognizer, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
return panGestureRecognizer;
}
- (BOOL)fd_viewControllerBasedNavigationBarAppearanceEnabled
{
NSNumber *number = objc_getAssociatedObject(self, _cmd);
if (number) {
return number.boolValue;
}
self.fd_viewControllerBasedNavigationBarAppearanceEnabled = YES;
return YES;
}
- (void)setFd_viewControllerBasedNavigationBarAppearanceEnabled:(BOOL)enabled
{
SEL key = @selector(fd_viewControllerBasedNavigationBarAppearanceEnabled);
objc_setAssociatedObject(self, key, @(enabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
@implementation UIViewController (FDFullscreenPopGesture)
- (BOOL)fd_interactivePopDisabled
{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
- (void)setFd_interactivePopDisabled:(BOOL)disabled
{
objc_setAssociatedObject(self, @selector(fd_interactivePopDisabled), @(disabled), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (BOOL)fd_prefersNavigationBarHidden
{
return [objc_getAssociatedObject(self, _cmd) boolValue];
}
- (void)setFd_prefersNavigationBarHidden:(BOOL)hidden
{
objc_setAssociatedObject(self, @selector(fd_prefersNavigationBarHidden), @(hidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (CGFloat)fd_interactivePopMaxAllowedInitialDistanceToLeftEdge
{
#if CGFLOAT_IS_DOUBLE
return [objc_getAssociatedObject(self, _cmd) doubleValue];
#else
return [objc_getAssociatedObject(self, _cmd) floatValue];
#endif
}
- (void)setFd_interactivePopMaxAllowedInitialDistanceToLeftEdge:(CGFloat)distance
{
SEL key = @selector(fd_interactivePopMaxAllowedInitialDistanceToLeftEdge);
objc_setAssociatedObject(self, key, @(MAX(0, distance)), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
//
// NSString+Unicode.h
// CodeLibary
//
// Created by zichaochu on 16/9/2.
// Copyright © 2016年 linxun. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface NSString (Unicode)
+ (NSString *)stringByReplacingUnicodeString:(NSString *)string;
@end
@interface NSArray (Unicode)
@end
@interface NSDictionary (Unicode)
@end
@interface NSSet (Unicode)
@end
//
// NSString+Unicode.m
// CodeLibary
//
// Created by zichaochu on 16/9/2.
// Copyright © 2016年 linxun. All rights reserved.
//
#import "NSString+Unicode.h"
#import <objc/runtime.h>
@implementation NSString (Unicode)
+ (NSString *)stringByReplacingUnicodeString:(NSString *)origin {
NSMutableString *string = [origin mutableCopy];
if (string.length > 0) {
[string replaceOccurrencesOfString:@"\\U" withString:@"\\u" options:0 range:NSMakeRange(0, string.length)];
CFStringRef transform = CFSTR("Any-Hex/Java");
CFStringTransform((__bridge CFMutableStringRef)string, NULL, transform, YES);
}
return string;
}
@end
@implementation NSArray (Unicode)
+ (void)load {
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(description)), class_getInstanceMethod([self class], @selector(replaceDescription)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:indent:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:indent:)));
}
- (NSString *)replaceDescription {
return [NSString stringByReplacingUnicodeString:[self replaceDescription]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale indent:(NSUInteger)level {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale indent:level]];
}
@end
@implementation NSDictionary (Unicode)
+ (void)load {
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(description)), class_getInstanceMethod([self class], @selector(replaceDescription)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:indent:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:indent:)));
}
- (NSString *)replaceDescription {
return [NSString stringByReplacingUnicodeString:[self replaceDescription]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale indent:(NSUInteger)level {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale indent:level]];
}
@end
@implementation NSSet (Unicode)
+ (void)load {
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(description)), class_getInstanceMethod([self class], @selector(replaceDescription)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:)));
method_exchangeImplementations(class_getInstanceMethod([self class], @selector(descriptionWithLocale:indent:)), class_getInstanceMethod([self class], @selector(replaceDescriptionWithLocale:indent:)));
}
- (NSString *)replaceDescription {
return [NSString stringByReplacingUnicodeString:[self replaceDescription]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale]];
}
- (NSString *)replaceDescriptionWithLocale:(nullable id)locale indent:(NSUInteger)level {
return [NSString stringByReplacingUnicodeString:[self replaceDescriptionWithLocale:locale indent:level]];
}
@end
//
// ImageCenterBtn.h
// ButtonTopImage
//
// Created by AliThink on 15/9/16.
// Copyright (c) 2015年 AliThink. All rights reserved.
//
// This code is distributed under the terms and conditions of the MIT license.
// Copyright (c) 2015 AliThink
//
// 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 ImageCenterButton : UIButton
// Round Image
@property BOOL imageIsRound;
// Image Padding
@property CGFloat padding;
// Spacing between imageview and textlabel
@property CGFloat imageTextSpace;
// Maximum imageview size
@property CGSize imageViewMaxSize;
// Button backgroundHighlighted
@property(nonatomic, strong) UIColor *backgroundHighlightedColor;
// Button backgroundNormal
@property(nonatomic, strong) UIColor *backgroundNormalColor;
@end
//
// ImageCenterBtn.m
// ButtonTopImage
//
// Created by AliThink on 15/9/16.
// Copyright (c) 2015年 AliThink. All rights reserved.
//
// This code is distributed under the terms and conditions of the MIT license.
// Copyright (c) 2015 AliThink
//
// 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 "ImageCenterButton.h"
#define IMAGECENTERBUTTON_IMAGE_TEXT_SPACING 10.0
#define IMAGECENTERBUTTON_TITLE_MIN_HEIGHT 14.0
#define IMAGECENTERBUTTON_PADDING_MIN 8.0
@implementation ImageCenterButton
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if (self) {
[self addAction];
}
return self;
}
- (instancetype)init {
self = [super init];
if (self) {
[self addAction];
}
return self;
}
- (void)addAction {
[self addTarget:self action:@selector(pressed:) forControlEvents:UIControlEventTouchDown];
[self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpInside];
[self addTarget:self action:@selector(touchUp:) forControlEvents:UIControlEventTouchUpOutside];
}
- (void)layoutSubviews {
[super layoutSubviews];
self.adjustsImageWhenHighlighted = NO;
if (!self.padding) {
self.padding = IMAGECENTERBUTTON_PADDING_MIN;
}
if (!self.imageTextSpace) {
self.imageTextSpace = IMAGECENTERBUTTON_IMAGE_TEXT_SPACING;
}
CGFloat titleLabelHeight = self.titleLabel.frame.size.height;
if (titleLabelHeight == 0) {
titleLabelHeight = IMAGECENTERBUTTON_TITLE_MIN_HEIGHT;
}
CGFloat imageMaxHeight = self.frame.size.height - titleLabelHeight - self.imageTextSpace - self.padding * 2;
CGFloat imageMaxWidth = self.frame.size.width - self.padding * 2;
if (self.imageViewMaxSize.height) {
imageMaxHeight = self.imageViewMaxSize.height;
}
if (self.imageViewMaxSize.width) {
imageMaxWidth = self.imageViewMaxSize.width;
}
//Set ImageView Threshold
if (self.imageView.frame.size.height > imageMaxHeight) {
CGRect newImageView = self.imageView.frame;
newImageView.size = CGSizeMake(imageMaxHeight / self.imageView.frame.size.height * self.imageView.frame.size.width, imageMaxHeight);
self.imageView.frame = newImageView;
}
if (self.imageView.frame.size.width > imageMaxWidth) {
CGRect newImageView = self.imageView.frame;
newImageView.size = CGSizeMake(imageMaxWidth , imageMaxWidth / self.imageView.frame.size.width * self.imageView.frame.size.height);
self.imageView.frame = newImageView;
}
CGFloat totalHeight = self.imageView.frame.size.height + self.imageTextSpace + titleLabelHeight;
//Center image
CGPoint center = self.imageView.center;
center.x = self.frame.size.width / 2.0;
center.y = self.frame.size.height / 2.0 - totalHeight / 2.0 + self.imageView.frame.size.height / 2.0;
self.imageView.center = center;
if (self.imageIsRound) {
self.imageView.layer.cornerRadius = self.imageView.frame.size.width / 2.0;
}
CGRect titleLabelFrame = self.titleLabel.frame;
titleLabelFrame.size = CGSizeMake(self.frame.size.width, titleLabelHeight);
self.titleLabel.frame = titleLabelFrame;
//Center text
CGPoint titleCenter = self.titleLabel.center;
titleCenter.x = self.frame.size.width / 2.0;
titleCenter.y = self.imageView.center.y + self.imageView.frame.size.height / 2.0 + self.imageTextSpace + titleLabelHeight / 2.0;
self.titleLabel.center = titleCenter;
self.titleLabel.textAlignment = NSTextAlignmentCenter;
}
- (void)pressed:(UIButton *)btn {
if (self.backgroundHighlightedColor) {
[btn setBackgroundColor:self.backgroundHighlightedColor];
} else {
[btn setBackgroundColor:[UIColor colorWithRed:0.9 green:0.9 blue:0.9 alpha:1]];
}
}
- (void)touchUp:(UIButton *)btn {
if (self.backgroundNormalColor) {
[btn setBackgroundColor:self.backgroundNormalColor];
} else {
[btn setBackgroundColor:[UIColor whiteColor]];
}
}
@end
//
// WRCustomNavigationBar.h
// CodeDemo
//
// Created by wangrui on 2017/10/22.
// Copyright © 2017年 wangrui. All rights reserved.
//
// Github地址:https://github.com/wangrui460/WRNavigationBar
#import <UIKit/UIKit.h>
@interface WRCustomNavigationBar : UIView
@property (nonatomic, copy) void(^onClickLeftButton)(void);
@property (nonatomic, copy) void(^onClickRightButton)(void);
@property (nonatomic, copy) NSString *title;
@property (nonatomic, strong) UIColor *titleLabelColor;
@property (nonatomic, strong) UIFont *titleLabelFont;
@property (nonatomic, strong) UIColor *barBackgroundColor;
@property (nonatomic, strong) UIImage *barBackgroundImage;
+ (instancetype)CustomNavigationBar;
- (void)wr_setBottomLineHidden:(BOOL)hidden;
- (void)wr_setBackgroundAlpha:(CGFloat)alpha;
- (void)wr_setTintColor:(UIColor *)color;
// 默认返回事件
//- (void)wr_setLeftButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted title:(NSString *)title titleColor:(UIColor *)titleColor;
//- (void)wr_setLeftButtonWithImage:(UIImage *)image title:(NSString *)title titleColor:(UIColor *)titleColor;
- (void)wr_setLeftButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted;
- (void)wr_setLeftButtonWithImage:(UIImage *)image;
- (void)wr_setLeftButtonWithTitle:(NSString *)title titleColor:(UIColor *)titleColor;
//- (void)wr_setRightButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted title:(NSString *)title titleColor:(UIColor *)titleColor;
//- (void)wr_setRightButtonWithImage:(UIImage *)image title:(NSString *)title titleColor:(UIColor *)titleColor;
- (void)wr_setRightButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted;
- (void)wr_setRightButtonWithImage:(UIImage *)image;
- (void)wr_setRightButtonWithTitle:(NSString *)title titleColor:(UIColor *)titleColor;
@end
//
// WRCustomNavigationBar.m
// CodeDemo
//
// Created by wangrui on 2017/10/22.
// Copyright © 2017年 wangrui. All rights reserved.
//
// Github地址:https://github.com/wangrui460/WRNavigationBar
#import "WRCustomNavigationBar.h"
#import "sys/utsname.h"
#define kWRDefaultTitleSize 18
#define kWRDefaultTitleColor [UIColor blackColor]
#define kWRDefaultBackgroundColor [UIColor whiteColor]
#define kWRScreenWidth [UIScreen mainScreen].bounds.size.width
@implementation UIViewController (WRRoute)
- (void)wr_toLastViewController
{
if (self.navigationController) {
if (self.navigationController.viewControllers.count == 1) {
if (self.presentingViewController) {
[self dismissViewControllerAnimated:YES completion:nil];
}
} else {
[self.navigationController popViewControllerAnimated:YES];
}
} else if(self.presentingViewController) {
[self dismissViewControllerAnimated:YES completion:nil];
}
}
+ (UIViewController*)wr_currentViewController {
UIViewController* rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController;
return [self wr_currentViewControllerFrom:rootViewController];
}
+ (UIViewController*)wr_currentViewControllerFrom:(UIViewController*)viewController
{
if ([viewController isKindOfClass:[UINavigationController class]]) {
UINavigationController* navigationController = (UINavigationController *)viewController;
return [self wr_currentViewControllerFrom:navigationController.viewControllers.lastObject];
}
else if([viewController isKindOfClass:[UITabBarController class]]) {
UITabBarController* tabBarController = (UITabBarController *)viewController;
return [self wr_currentViewControllerFrom:tabBarController.selectedViewController];
}
else if (viewController.presentedViewController != nil) {
return [self wr_currentViewControllerFrom:viewController.presentedViewController];
}
else {
return viewController;
}
}
@end
@interface WRCustomNavigationBar ()
@property (nonatomic, strong) UILabel *titleLable;
@property (nonatomic, strong) UIButton *leftButton;
@property (nonatomic, strong) UIButton *rightButton;
@property (nonatomic, strong) UIView *bottomLine;
@property (nonatomic, strong) UIView *backgroundView;
@property (nonatomic, strong) UIImageView *backgroundImageView;
@end
@implementation WRCustomNavigationBar
+ (instancetype)CustomNavigationBar {
WRCustomNavigationBar *navigationBar = [[self alloc] initWithFrame:CGRectMake(0, 0, kWRScreenWidth, [WRCustomNavigationBar navBarBottom])];
return navigationBar;
}
- (instancetype)init {
if (self = [super init]) {
[self setupView];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
[self setupView];
}
return self;
}
-(void)setupView {
[self addSubview:self.backgroundView];
[self addSubview:self.backgroundImageView];
[self addSubview:self.leftButton];
[self addSubview:self.titleLable];
[self addSubview:self.rightButton];
[self addSubview:self.bottomLine];
[self updateFrame];
self.backgroundColor = [UIColor clearColor];
self.backgroundView.backgroundColor = kWRDefaultBackgroundColor;
}
// TODO:这边结合 WRCellView 会不会更好呢?
-(void)updateFrame {
NSInteger top = ([WRCustomNavigationBar isIphoneX]) ? 44 : 20;
NSInteger margin = 0;
NSInteger buttonHeight = 44;
NSInteger buttonWidth = 44;
NSInteger titleLabelHeight = 44;
NSInteger titleLabelWidth = 180;
self.backgroundView.frame = self.bounds;
self.backgroundImageView.frame = self.bounds;
self.leftButton.frame = CGRectMake(margin, top, buttonWidth, buttonHeight);
self.rightButton.frame = CGRectMake(kWRScreenWidth - buttonWidth - margin, top, buttonWidth, buttonHeight);
self.titleLable.frame = CGRectMake((kWRScreenWidth - titleLabelWidth) / 2, top, titleLabelWidth, titleLabelHeight);
self.bottomLine.frame = CGRectMake(0, (CGFloat)(self.bounds.size.height-0.5), kWRScreenWidth, 0.5);
}
#pragma mark - 导航栏左右按钮事件
-(void)clickBack {
if (self.onClickLeftButton) {
self.onClickLeftButton();
} else {
UIViewController *currentVC = [UIViewController wr_currentViewController];
[currentVC wr_toLastViewController];
}
}
-(void)clickRight {
if (self.onClickRightButton) {
self.onClickRightButton();
}
}
- (void)wr_setBottomLineHidden:(BOOL)hidden {
self.bottomLine.hidden = hidden;
}
- (void)wr_setBackgroundAlpha:(CGFloat)alpha {
self.backgroundView.alpha = alpha;
self.backgroundImageView.alpha = alpha;
self.bottomLine.alpha = alpha;
}
- (void)wr_setTintColor:(UIColor *)color {
[self.leftButton setTitleColor:color forState:UIControlStateNormal];
[self.rightButton setTitleColor:color forState:UIControlStateNormal];
[self.titleLable setTextColor:color];
}
#pragma mark - 左右按钮
- (void)wr_setLeftButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted title:(NSString *)title titleColor:(UIColor *)titleColor {
self.leftButton.hidden = NO;
[self.leftButton setImage:normal forState:UIControlStateNormal];
[self.leftButton setImage:highlighted forState:UIControlStateHighlighted];
[self.leftButton setTitle:title forState:UIControlStateNormal];
[self.leftButton setTitleColor:titleColor forState:UIControlStateNormal];
}
- (void)wr_setLeftButtonWithImage:(UIImage *)image title:(NSString *)title titleColor:(UIColor *)titleColor {
[self wr_setLeftButtonWithNormal:image highlighted:image title:title titleColor:titleColor];
}
- (void)wr_setLeftButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted {
[self wr_setLeftButtonWithNormal:normal highlighted:highlighted title:nil titleColor:nil];
}
- (void)wr_setLeftButtonWithImage:(UIImage *)image {
[self wr_setLeftButtonWithNormal:image highlighted:image title:nil titleColor:nil];
}
- (void)wr_setLeftButtonWithTitle:(NSString *)title titleColor:(UIColor *)titleColor {
[self wr_setLeftButtonWithNormal:nil highlighted:nil title:title titleColor:titleColor];
}
- (void)wr_setRightButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted title:(NSString *)title titleColor:(UIColor *)titleColor {
self.rightButton.hidden = NO;
[self.rightButton setImage:normal forState:UIControlStateNormal];
[self.rightButton setImage:highlighted forState:UIControlStateHighlighted];
[self.rightButton setTitle:title forState:UIControlStateNormal];
[self.rightButton setTitleColor:titleColor forState:UIControlStateNormal];
}
- (void)wr_setRightButtonWithImage:(UIImage *)image title:(NSString *)title titleColor:(UIColor *)titleColor {
[self wr_setRightButtonWithNormal:image highlighted:image title:title titleColor:titleColor];
}
- (void)wr_setRightButtonWithNormal:(UIImage *)normal highlighted:(UIImage *)highlighted {
[self wr_setRightButtonWithNormal:normal highlighted:highlighted title:nil titleColor:nil];
}
- (void)wr_setRightButtonWithImage:(UIImage *)image {
[self wr_setRightButtonWithNormal:image highlighted:image title:nil titleColor:nil];
}
- (void)wr_setRightButtonWithTitle:(NSString *)title titleColor:(UIColor *)titleColor {
[self wr_setRightButtonWithNormal:nil highlighted:nil title:title titleColor:titleColor];
}
#pragma mark - setter
-(void)setTitle:(NSString *)title {
_title = title;
self.titleLable.hidden = NO;
self.titleLable.text = _title;
}
- (void)setTitleLabelColor:(UIColor *)titleLabelColor {
_titleLabelColor = titleLabelColor;
self.titleLable.textColor = _titleLabelColor;
}
- (void)setTitleLabelFont:(UIFont *)titleLabelFont {
_titleLabelFont = titleLabelFont;
self.titleLable.font = _titleLabelFont;
}
-(void)setBarBackgroundColor:(UIColor *)barBackgroundColor {
self.backgroundImageView.hidden = YES;
_barBackgroundColor = barBackgroundColor;
self.backgroundView.hidden = NO;
self.backgroundView.backgroundColor = _barBackgroundColor;
}
- (void)setBarBackgroundImage:(UIImage *)barBackgroundImage {
self.backgroundView.hidden = YES;
_barBackgroundImage = barBackgroundImage;
self.backgroundImageView.hidden = NO;
self.backgroundImageView.image = _barBackgroundImage;
}
#pragma mark - getter
-(UIButton *)leftButton
{
if (!_leftButton) {
_leftButton = [[UIButton alloc] init];
[_leftButton addTarget:self action:@selector(clickBack) forControlEvents:UIControlEventTouchUpInside];
_leftButton.imageView.contentMode = UIViewContentModeCenter;
_leftButton.hidden = YES;
}
return _leftButton;
}
-(UIButton *)rightButton {
if (!_rightButton) {
_rightButton = [[UIButton alloc] init];
[_rightButton addTarget:self action:@selector(clickRight) forControlEvents:UIControlEventTouchUpInside];
_rightButton.imageView.contentMode = UIViewContentModeCenter;
_rightButton.hidden = YES;
}
return _rightButton;
}
-(UILabel *)titleLable {
if (!_titleLable) {
_titleLable = [[UILabel alloc] init];
_titleLable.textColor = kWRDefaultTitleColor;
_titleLable.font = [UIFont systemFontOfSize:kWRDefaultTitleSize];
_titleLable.textAlignment = NSTextAlignmentCenter;
_titleLable.hidden = YES;
}
return _titleLable;
}
- (UIView *)bottomLine {
if (!_bottomLine) {
_bottomLine = [[UIView alloc] init];
_bottomLine.backgroundColor = [UIColor colorWithRed:(CGFloat)(218.0/255.0) green:(CGFloat)(218.0/255.0) blue:(CGFloat)(218.0/255.0) alpha:1.0];
}
return _bottomLine;
}
- (UIView *)backgroundView {
if (!_backgroundView) {
_backgroundView = [[UIView alloc] init];
}
return _backgroundView;
}
-(UIImageView *)backgroundImageView {
if (!_backgroundImageView) {
_backgroundImageView = [[UIImageView alloc] init];
_backgroundImageView.hidden = YES;
}
return _backgroundImageView;
}
+ (int)navBarBottom {
return 44 + CGRectGetHeight([UIApplication sharedApplication].statusBarFrame);
}
+ (BOOL)isIphoneX {
struct utsname systemInfo;
uname(&systemInfo);
NSString *platform = [NSString stringWithCString:systemInfo.machine encoding:NSASCIIStringEncoding];
if ([platform isEqualToString:@"i386"] || [platform isEqualToString:@"x86_64"]) {
// judgment by height when in simulators
return (CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(375, 812)) ||
CGSizeEqualToSize([UIScreen mainScreen].bounds.size, CGSizeMake(812, 375)));
}
BOOL isIPhoneX = [platform isEqualToString:@"iPhone10,3"] || [platform isEqualToString:@"iPhone10,6"];
return isIPhoneX;
}
@end
//
// UINavigationBar+WRAddition.h
// StoryBoardDemo
//
// Created by wangrui on 2017/4/9.
// Copyright © 2017年 wangrui. All rights reserved.
//
// Github地址:https://github.com/wangrui460/WRNavigationBar
#import <UIKit/UIKit.h>
@class WRCustomNavigationBar;
@interface WRNavigationBar : UIView
+ (BOOL)isIphoneX;
+ (CGFloat)navBarBottom;
+ (CGFloat)tabBarHeight;
+ (CGFloat)screenWidth;
+ (CGFloat)screenHeight;
@end
#pragma mark - Default
@interface WRNavigationBar (WRDefault)
/// 局部使用该库 待开发
//+ (void)wr_local;
/// 广泛使用该库 default 暂时是默认, wr_local 完成后,wr_local就会变成默认
+ (void)wr_widely;
/// 局部使用该库时,设置需要用到的控制器 待开发
//+ (void)wr_setWhitelist:(NSArray<NSString *> *)list;
/// 广泛使用该库时,设置需要屏蔽的控制器
+ (void)wr_setBlacklist:(NSArray<NSString *> *)list;
/** set default barTintColor of UINavigationBar */
+ (void)wr_setDefaultNavBarBarTintColor:(UIColor *)color;
/** set default barBackgroundImage of UINavigationBar */
/** warning: wr_setDefaultNavBarBackgroundImage is deprecated! place use WRCustomNavigationBar */
//+ (void)wr_setDefaultNavBarBackgroundImage:(UIImage *)image;
/** set default tintColor of UINavigationBar */
+ (void)wr_setDefaultNavBarTintColor:(UIColor *)color;
/** set default titleColor of UINavigationBar */
+ (void)wr_setDefaultNavBarTitleColor:(UIColor *)color;
/** set default statusBarStyle of UIStatusBar */
+ (void)wr_setDefaultStatusBarStyle:(UIStatusBarStyle)style;
/** set default shadowImage isHidden of UINavigationBar */
+ (void)wr_setDefaultNavBarShadowImageHidden:(BOOL)hidden;
@end
#pragma mark - UINavigationBar
@interface UINavigationBar (WRAddition) <UINavigationBarDelegate>
/** 设置导航栏所有BarButtonItem的透明度 */
- (void)wr_setBarButtonItemsAlpha:(CGFloat)alpha hasSystemBackIndicator:(BOOL)hasSystemBackIndicator;
/** 设置导航栏在垂直方向上平移多少距离 */
- (void)wr_setTranslationY:(CGFloat)translationY;
/** 获取当前导航栏在垂直方向上偏移了多少 */
- (CGFloat)wr_getTranslationY;
@end
#pragma mark - UIViewController
@interface UIViewController (WRAddition)
/** record current ViewController navigationBar backgroundImage */
/** warning: wr_setDefaultNavBarBackgroundImage is deprecated! place use WRCustomNavigationBar */
//- (void)wr_setNavBarBackgroundImage:(UIImage *)image;
- (UIImage *)wr_navBarBackgroundImage;
/** record current ViewController navigationBar barTintColor */
- (void)wr_setNavBarBarTintColor:(UIColor *)color;
- (UIColor *)wr_navBarBarTintColor;
/** record current ViewController navigationBar backgroundAlpha */
- (void)wr_setNavBarBackgroundAlpha:(CGFloat)alpha;
- (CGFloat)wr_navBarBackgroundAlpha;
/** record current ViewController navigationBar tintColor */
- (void)wr_setNavBarTintColor:(UIColor *)color;
- (UIColor *)wr_navBarTintColor;
/** record current ViewController titleColor */
- (void)wr_setNavBarTitleColor:(UIColor *)color;
- (UIColor *)wr_navBarTitleColor;
/** record current ViewController statusBarStyle */
- (void)wr_setStatusBarStyle:(UIStatusBarStyle)style;
- (UIStatusBarStyle)wr_statusBarStyle;
/** record current ViewController navigationBar shadowImage hidden */
- (void)wr_setNavBarShadowImageHidden:(BOOL)hidden;
- (BOOL)wr_navBarShadowImageHidden;
/** record current ViewController custom navigationBar */
/** warning: wr_setDefaultNavBarBackgroundImage is deprecated! place use WRCustomNavigationBar */
//- (void)wr_setCustomNavBar:(WRCustomNavigationBar *)navBar;
@end
//
// UINavigationBar+WRAddition.m
// StoryBoardDemo
//
// Created by wangrui on 2017/4/9.
// Copyright © 2017年 wangrui. All rights reserved.
//
// Github地址:https://github.com/wangrui460/WRNavigationBar
#import "WRNavigationBar.h"
#import <objc/runtime.h>
#import "sys/utsname.h"
@implementation WRNavigationBar
+ (BOOL)isIphoneX {
// 判断当前设备类型是否为 iPhone
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
// 获取屏幕的高度
// CGFloat screenHeight = [[UIScreen mainScreen] bounds].size.height;
// 目前已知的两个异形屏尺寸:375x812、414x896
if (IS_IPHONE_SPECIAL) {
return YES;
}
}
return NO;
}
+ (CGFloat)navBarBottom {
return [self isIphoneX] ? 88 : 64;
}
+ (CGFloat)tabBarHeight {
return [self isIphoneX] ? 83 : 49;
}
+ (CGFloat)screenWidth {
return [UIScreen mainScreen].bounds.size.width;
}
+ (CGFloat)screenHeight {
return [UIScreen mainScreen].bounds.size.height;
}
@end
//=============================================================================
#pragma mark - default navigationBar barTintColor、tintColor and statusBarStyle YOU CAN CHANGE!!!
//=============================================================================
@implementation WRNavigationBar (WRDefault)
static char kWRIsLocalUsedKey;
static char kWRWhiteistKey;
static char kWRBlacklistKey;
static char kWRDefaultNavBarBarTintColorKey;
static char kWRDefaultNavBarBackgroundImageKey;
static char kWRDefaultNavBarTintColorKey;
static char kWRDefaultNavBarTitleColorKey;
static char kWRDefaultStatusBarStyleKey;
static char kWRDefaultNavBarShadowImageHiddenKey;
+ (BOOL)isLocalUsed {
id isLocal = objc_getAssociatedObject(self, &kWRIsLocalUsedKey);
return (isLocal != nil) ? [isLocal boolValue] : NO;
}
+ (void)wr_local {
objc_setAssociatedObject(self, &kWRIsLocalUsedKey, @(YES), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)wr_widely {
objc_setAssociatedObject(self, &kWRIsLocalUsedKey, @(NO), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (NSArray<NSString *> *)whitelist {
NSArray<NSString *> *list = (NSArray<NSString *> *)objc_getAssociatedObject(self, &kWRWhiteistKey);
return (list != nil) ? list : nil;
}
+ (void)wr_setWhitelist:(NSArray<NSString *> *)list {
NSAssert([self isLocalUsed], @"白名单是在设置 局部使用 该库的情况下使用的");
objc_setAssociatedObject(self, &kWRWhiteistKey, list, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (NSArray<NSString *> *)blacklist {
NSArray<NSString *> *list = (NSArray<NSString *> *)objc_getAssociatedObject(self, &kWRBlacklistKey);
return (list != nil) ? list : nil;
}
+ (void)wr_setBlacklist:(NSArray<NSString *> *)list {
NSAssert(list, @"list 不能设置为nil");
NSAssert(![self isLocalUsed], @"黑名单是在设置 广泛使用 该库的情况下使用的");
objc_setAssociatedObject(self, &kWRBlacklistKey, list, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (BOOL)needUpdateNavigationBar:(UIViewController *)vc {
NSString *vcStr = NSStringFromClass(vc.class);
if ([self isLocalUsed]) {
return [[self whitelist] containsObject:vcStr]; // 当白名单里 有 表示需要更新
} else {
return ![[self blacklist] containsObject:vcStr];// 当黑名单里 没有 表示需要更新
}
}
+ (UIColor *)defaultNavBarBarTintColor {
UIColor *color = (UIColor *)objc_getAssociatedObject(self, &kWRDefaultNavBarBarTintColorKey);
return (color != nil) ? color : [UIColor whiteColor];
}
+ (void)wr_setDefaultNavBarBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRDefaultNavBarBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (UIImage *)defaultNavBarBackgroundImage {
UIImage *image = (UIImage *)objc_getAssociatedObject(self, &kWRDefaultNavBarBackgroundImageKey);
return image;
}
+ (void)wr_setDefaultNavBarBackgroundImage:(UIImage *)image {
objc_setAssociatedObject(self, &kWRDefaultNavBarBackgroundImageKey, image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (UIColor *)defaultNavBarTintColor {
UIColor *color = (UIColor *)objc_getAssociatedObject(self, &kWRDefaultNavBarTintColorKey);
return (color != nil) ? color : [UIColor colorWithRed:0 green:0.478431 blue:1 alpha:1.0];
}
+ (void)wr_setDefaultNavBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRDefaultNavBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (UIColor *)defaultNavBarTitleColor {
UIColor *color = (UIColor *)objc_getAssociatedObject(self, &kWRDefaultNavBarTitleColorKey);
return (color != nil) ? color : [UIColor blackColor];
}
+ (void)wr_setDefaultNavBarTitleColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRDefaultNavBarTitleColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (UIStatusBarStyle)defaultStatusBarStyle {
id style = objc_getAssociatedObject(self, &kWRDefaultStatusBarStyleKey);
return (style != nil) ? [style integerValue] : UIStatusBarStyleDefault;
}
+ (void)wr_setDefaultStatusBarStyle:(UIStatusBarStyle)style {
objc_setAssociatedObject(self, &kWRDefaultStatusBarStyleKey, @(style), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (BOOL)defaultNavBarShadowImageHidden {
id hidden = objc_getAssociatedObject(self, &kWRDefaultNavBarShadowImageHiddenKey);
return (hidden != nil) ? [hidden boolValue] : NO;
}
+ (void)wr_setDefaultNavBarShadowImageHidden:(BOOL)hidden {
objc_setAssociatedObject(self, &kWRDefaultNavBarShadowImageHiddenKey, @(hidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (CGFloat)defaultNavBarBackgroundAlpha {
return 1.0;
}
+ (UIColor *)middleColor:(UIColor *)fromColor toColor:(UIColor *)toColor percent:(CGFloat)percent {
CGFloat fromRed = 0;
CGFloat fromGreen = 0;
CGFloat fromBlue = 0;
CGFloat fromAlpha = 0;
[fromColor getRed:&fromRed green:&fromGreen blue:&fromBlue alpha:&fromAlpha];
CGFloat toRed = 0;
CGFloat toGreen = 0;
CGFloat toBlue = 0;
CGFloat toAlpha = 0;
[toColor getRed:&toRed green:&toGreen blue:&toBlue alpha:&toAlpha];
CGFloat newRed = fromRed + (toRed - fromRed) * percent;
CGFloat newGreen = fromGreen + (toGreen - fromGreen) * percent;
CGFloat newBlue = fromBlue + (toBlue - fromBlue) * percent;
CGFloat newAlpha = fromAlpha + (toAlpha - fromAlpha) * percent;
return [UIColor colorWithRed:newRed green:newGreen blue:newBlue alpha:newAlpha];
}
+ (CGFloat)middleAlpha:(CGFloat)fromAlpha toAlpha:(CGFloat)toAlpha percent:(CGFloat)percent {
return fromAlpha + (toAlpha - fromAlpha) * percent;
}
@end
//=============================================================================
#pragma mark - UINavigationBar
//=============================================================================
@implementation UINavigationBar (WRAddition)
static char kWRBackgroundViewKey;
static char kWRBackgroundImageViewKey;
static char kWRBackgroundImageKey;
- (UIView *)backgroundView {
return (UIView *)objc_getAssociatedObject(self, &kWRBackgroundViewKey);
}
- (void)setBackgroundView:(UIView *)backgroundView {
if (backgroundView) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wr_keyboardDidShow) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wr_keyboardWillHide) name:UIKeyboardWillHideNotification object:nil];
} else {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
objc_setAssociatedObject(self, &kWRBackgroundViewKey, backgroundView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIImageView *)backgroundImageView {
return (UIImageView *)objc_getAssociatedObject(self, &kWRBackgroundImageViewKey);
}
- (void)setBackgroundImageView:(UIImageView *)bgImageView {
objc_setAssociatedObject(self, &kWRBackgroundImageViewKey, bgImageView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIImage *)backgroundImage {
return (UIImage *)objc_getAssociatedObject(self, &kWRBackgroundImageKey);
}
- (void)setBackgroundImage:(UIImage *)image {
objc_setAssociatedObject(self, &kWRBackgroundImageKey, image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// set navigationBar backgroundImage
- (void)wr_setBackgroundImage:(UIImage *)image {
[self.backgroundView removeFromSuperview];
self.backgroundView = nil;
if (self.backgroundImageView == nil) {
// add a image(nil color) to _UIBarBackground make it clear
[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
if (self.subviews.count > 0) {
self.backgroundImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), [WRNavigationBar navBarBottom])];
self.backgroundImageView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
// _UIBarBackground is first subView for navigationBar
[self.subviews.firstObject insertSubview:self.backgroundImageView atIndex:0];
}
}
self.backgroundImage = image;
self.backgroundImageView.image = image;
}
// set navigationBar barTintColor
- (void)wr_setBackgroundColor:(UIColor *)color {
[self.backgroundImageView removeFromSuperview];
self.backgroundImageView = nil;
self.backgroundImage = nil;
if (self.backgroundView == nil) {
// add a image(nil color) to _UIBarBackground make it clear
[self setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
self.backgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CGRectGetWidth(self.bounds), [WRNavigationBar navBarBottom])];
self.backgroundView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
// _UIBarBackground is first subView for navigationBar
[self.subviews.firstObject insertSubview:self.backgroundView atIndex:0];
}
self.backgroundView.backgroundColor = color;
}
- (void)wr_keyboardDidShow {
[self wr_restoreUIBarBackgroundFrame];
}
- (void)wr_keyboardWillHide {
[self wr_restoreUIBarBackgroundFrame];
}
- (void)wr_restoreUIBarBackgroundFrame {
// IQKeyboardManager change _UIBarBackground frame sometimes, so I need restore it
for (UIView *view in self.subviews) {
Class _UIBarBackgroundClass = NSClassFromString(@"_UIBarBackground");
if (_UIBarBackgroundClass != nil) {
if ([view isKindOfClass:_UIBarBackgroundClass]) {
view.frame = CGRectMake(0, self.frame.size.height-[WRNavigationBar navBarBottom], [WRNavigationBar screenWidth], [WRNavigationBar navBarBottom]);
}
}
}
}
// set _UIBarBackground alpha (_UIBarBackground subviews alpha <= _UIBarBackground alpha)
- (void)wr_setBackgroundAlpha:(CGFloat)alpha {
UIView *barBackgroundView = self.subviews.firstObject;
if (@available(iOS 11.0, *))
{ // sometimes we can't change _UIBarBackground alpha
for (UIView *view in barBackgroundView.subviews) {
view.alpha = alpha;
}
} else {
barBackgroundView.alpha = alpha;
}
}
- (void)wr_setBarButtonItemsAlpha:(CGFloat)alpha hasSystemBackIndicator:(BOOL)hasSystemBackIndicator {
for (UIView *view in self.subviews) {
if (hasSystemBackIndicator == YES)
{ // _UIBarBackground/_UINavigationBarBackground对应的view是系统导航栏,不需要改变其透明度
Class _UIBarBackgroundClass = NSClassFromString(@"_UIBarBackground");
if (_UIBarBackgroundClass != nil) {
if ([view isKindOfClass:_UIBarBackgroundClass] == NO) {
view.alpha = alpha;
}
}
Class _UINavigationBarBackground = NSClassFromString(@"_UINavigationBarBackground");
if (_UINavigationBarBackground != nil) {
if ([view isKindOfClass:_UINavigationBarBackground] == NO) {
view.alpha = alpha;
}
}
}
else {
// 这里如果不做判断的话,会显示 backIndicatorImage
if ([view isKindOfClass:NSClassFromString(@"_UINavigationBarBackIndicatorView")] == NO) {
Class _UIBarBackgroundClass = NSClassFromString(@"_UIBarBackground");
if (_UIBarBackgroundClass != nil) {
if ([view isKindOfClass:_UIBarBackgroundClass] == NO) {
view.alpha = alpha;
}
}
Class _UINavigationBarBackground = NSClassFromString(@"_UINavigationBarBackground");
if (_UINavigationBarBackground != nil) {
if ([view isKindOfClass:_UINavigationBarBackground] == NO) {
view.alpha = alpha;
}
}
}
}
}
}
// 设置导航栏在垂直方向上平移多少距离 CGAffineTransformMakeTranslation 平移
- (void)wr_setTranslationY:(CGFloat)translationY {
self.transform = CGAffineTransformMakeTranslation(0, translationY);
}
/// 获取当前导航栏在垂直方向上偏移了多少
- (CGFloat)wr_getTranslationY {
return self.transform.ty;
}
#pragma mark - call swizzling methods active 主动调用交换方法
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL needSwizzleSelectors[1] = {
@selector(setTitleTextAttributes:)
};
for (int i = 0; i < 1; i++) {
SEL selector = needSwizzleSelectors[i];
NSString *newSelectorStr = [NSString stringWithFormat:@"wr_%@", NSStringFromSelector(selector)];
Method originMethod = class_getInstanceMethod(self, selector);
Method swizzledMethod = class_getInstanceMethod(self, NSSelectorFromString(newSelectorStr));
method_exchangeImplementations(originMethod, swizzledMethod);
}
});
}
- (void)wr_setTitleTextAttributes:(NSDictionary<NSString *,id> *)titleTextAttributes {
NSMutableDictionary<NSString *,id> *newTitleTextAttributes = [titleTextAttributes mutableCopy];
if (newTitleTextAttributes == nil) {
return;
}
NSDictionary<NSString *,id> *originTitleTextAttributes = self.titleTextAttributes;
if (originTitleTextAttributes == nil) {
[self wr_setTitleTextAttributes:newTitleTextAttributes];
return;
}
__block UIColor *titleColor;
[originTitleTextAttributes enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
if ([key isEqual:NSForegroundColorAttributeName]) {
titleColor = (UIColor *)obj;
*stop = YES;
}
}];
if (titleColor == nil) {
[self wr_setTitleTextAttributes:newTitleTextAttributes];
return;
}
if (newTitleTextAttributes[NSForegroundColorAttributeName] == nil) {
newTitleTextAttributes[NSForegroundColorAttributeName] = titleColor;
}
[self wr_setTitleTextAttributes:newTitleTextAttributes];
}
@end
@interface UIViewController (Addition)
- (void)setPushToCurrentVCFinished:(BOOL)isFinished;
@end
//==========================================================================
#pragma mark - UINavigationController
//==========================================================================
@implementation UINavigationController (WRAddition)
static CGFloat wrPopDuration = 0.12;
static int wrPopDisplayCount = 0;
- (CGFloat)wrPopProgress {
CGFloat all = 60 * wrPopDuration;
int current = MIN(all, wrPopDisplayCount);
return current / all;
}
static CGFloat wrPushDuration = 0.10;
static int wrPushDisplayCount = 0;
- (CGFloat)wrPushProgress {
CGFloat all = 60 * wrPushDuration;
int current = MIN(all, wrPushDisplayCount);
return current / all;
}
- (UIStatusBarStyle)preferredStatusBarStyle {
return [self.topViewController wr_statusBarStyle];
}
- (void)setNeedsNavigationBarUpdateForBarBackgroundImage:(UIImage *)backgroundImage {
[self.navigationBar wr_setBackgroundImage:backgroundImage];
}
- (void)setNeedsNavigationBarUpdateForBarTintColor:(UIColor *)barTintColor {
[self.navigationBar wr_setBackgroundColor:barTintColor];
}
- (void)setNeedsNavigationBarUpdateForBarBackgroundAlpha:(CGFloat)barBackgroundAlpha {
[self.navigationBar wr_setBackgroundAlpha:barBackgroundAlpha];
}
- (void)setNeedsNavigationBarUpdateForTintColor:(UIColor *)tintColor {
self.navigationBar.tintColor = tintColor;
}
- (void)setNeedsNavigationBarUpdateForShadowImageHidden:(BOOL)hidden {
self.navigationBar.shadowImage = (hidden == YES) ? [UIImage new] : nil;
}
- (void)setNeedsNavigationBarUpdateForTitleColor:(UIColor *)titleColor {
NSDictionary *titleTextAttributes = [self.navigationBar titleTextAttributes];
if (titleTextAttributes == nil) {
self.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName:titleColor};
return;
}
NSMutableDictionary *newTitleTextAttributes = [titleTextAttributes mutableCopy];
newTitleTextAttributes[NSForegroundColorAttributeName] = titleColor;
self.navigationBar.titleTextAttributes = newTitleTextAttributes;
}
- (void)updateNavigationBarWithFromVC:(UIViewController *)fromVC toVC:(UIViewController *)toVC progress:(CGFloat)progress {
// change navBarBarTintColor
UIColor *fromBarTintColor = [fromVC wr_navBarBarTintColor];
UIColor *toBarTintColor = [toVC wr_navBarBarTintColor];
UIColor *newBarTintColor = [WRNavigationBar middleColor:fromBarTintColor toColor:toBarTintColor percent:progress];
if ([WRNavigationBar needUpdateNavigationBar:fromVC] || [WRNavigationBar needUpdateNavigationBar:toVC]) {
[self setNeedsNavigationBarUpdateForBarTintColor:newBarTintColor];
}
// change navBarTintColor
UIColor *fromTintColor = [fromVC wr_navBarTintColor];
UIColor *toTintColor = [toVC wr_navBarTintColor];
UIColor *newTintColor = [WRNavigationBar middleColor:fromTintColor toColor:toTintColor percent:progress];
if ([WRNavigationBar needUpdateNavigationBar:fromVC]) {
[self setNeedsNavigationBarUpdateForTintColor:newTintColor];
}
// change navBarTitleColor(在wr_popToViewController:animated:方法中直接改变标题颜色)
UIColor *fromTitleColor = [fromVC wr_navBarTitleColor];
UIColor *toTitleColor = [toVC wr_navBarTitleColor];
UIColor *newTitleColor = [WRNavigationBar middleColor:fromTitleColor toColor:toTitleColor percent:progress];
[self setNeedsNavigationBarUpdateForTitleColor:newTitleColor];
// change navBar _UIBarBackground alpha
CGFloat fromBarBackgroundAlpha = [fromVC wr_navBarBackgroundAlpha];
CGFloat toBarBackgroundAlpha = [toVC wr_navBarBackgroundAlpha];
CGFloat newBarBackgroundAlpha = [WRNavigationBar middleAlpha:fromBarBackgroundAlpha toAlpha:toBarBackgroundAlpha percent:progress];
[self setNeedsNavigationBarUpdateForBarBackgroundAlpha:newBarBackgroundAlpha];
}
#pragma mark - call swizzling methods active 主动调用交换方法
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL needSwizzleSelectors[4] = {
NSSelectorFromString(@"_updateInteractiveTransition:"),
@selector(popToViewController:animated:),
@selector(popToRootViewControllerAnimated:),
@selector(pushViewController:animated:)
};
for (int i = 0; i < 4; i++) {
SEL selector = needSwizzleSelectors[i];
NSString *newSelectorStr = [[NSString stringWithFormat:@"wr_%@", NSStringFromSelector(selector)] stringByReplacingOccurrencesOfString:@"__" withString:@"_"];
Method originMethod = class_getInstanceMethod(self, selector);
Method swizzledMethod = class_getInstanceMethod(self, NSSelectorFromString(newSelectorStr));
method_exchangeImplementations(originMethod, swizzledMethod);
}
});
}
- (NSArray<UIViewController *> *)wr_popToViewController:(UIViewController *)viewController animated:(BOOL)animated {
// pop 的时候直接改变 barTintColor、tintColor
[self setNeedsNavigationBarUpdateForTitleColor:[viewController wr_navBarTitleColor]];
[self setNeedsNavigationBarUpdateForTintColor:[viewController wr_navBarTintColor]];
__block CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(popNeedDisplay)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[CATransaction setCompletionBlock:^{
[displayLink invalidate];
displayLink = nil;
wrPopDisplayCount = 0;
}];
[CATransaction setAnimationDuration:wrPopDuration];
[CATransaction begin];
NSArray<UIViewController *> *vcs = [self wr_popToViewController:viewController animated:animated];
[CATransaction commit];
return vcs;
}
- (NSArray<UIViewController *> *)wr_popToRootViewControllerAnimated:(BOOL)animated {
__block CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(popNeedDisplay)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[CATransaction setCompletionBlock:^{
[displayLink invalidate];
displayLink = nil;
wrPopDisplayCount = 0;
}];
[CATransaction setAnimationDuration:wrPopDuration];
[CATransaction begin];
NSArray<UIViewController *> *vcs = [self wr_popToRootViewControllerAnimated:animated];
[CATransaction commit];
return vcs;
}
// change navigationBar barTintColor smooth before pop to current VC finished
- (void)popNeedDisplay {
if (self.topViewController != nil && self.topViewController.transitionCoordinator != nil) {
wrPopDisplayCount += 1;
CGFloat popProgress = [self wrPopProgress];
UIViewController *fromVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextToViewControllerKey];
[self updateNavigationBarWithFromVC:fromVC toVC:toVC progress:popProgress];
}
}
- (void)wr_pushViewController:(UIViewController *)viewController animated:(BOOL)animated {
__block CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(pushNeedDisplay)];
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
[CATransaction setCompletionBlock:^{
[displayLink invalidate];
displayLink = nil;
wrPushDisplayCount = 0;
[viewController setPushToCurrentVCFinished:YES];
}];
[CATransaction setAnimationDuration:wrPushDuration];
[CATransaction begin];
[self wr_pushViewController:viewController animated:animated];
[CATransaction commit];
}
// change navigationBar barTintColor smooth before push to current VC finished or before pop to current VC finished
- (void)pushNeedDisplay {
if (self.topViewController != nil && self.topViewController.transitionCoordinator != nil) {
wrPushDisplayCount += 1;
CGFloat pushProgress = [self wrPushProgress];
UIViewController *fromVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextToViewControllerKey];
[self updateNavigationBarWithFromVC:fromVC toVC:toVC progress:pushProgress];
}
}
#pragma mark - deal the gesture of return
- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {
__weak typeof (self) weakSelf = self;
id<UIViewControllerTransitionCoordinator> coor = [self.topViewController transitionCoordinator];
if ([coor initiallyInteractive] == YES) {
NSString *sysVersion = [[UIDevice currentDevice] systemVersion];
if ([sysVersion floatValue] >= 10) {
[coor notifyWhenInteractionChangesUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
__strong typeof (self) pThis = weakSelf;
[pThis dealInteractionChanges:context];
}];
} else {
[coor notifyWhenInteractionEndsUsingBlock:^(id<UIViewControllerTransitionCoordinatorContext> _Nonnull context) {
__strong typeof (self) pThis = weakSelf;
[pThis dealInteractionChanges:context];
}];
}
return YES;
}
NSUInteger itemCount = self.navigationBar.items.count;
NSUInteger n = self.viewControllers.count >= itemCount ? 2 : 1;
UIViewController *popToVC = self.viewControllers[self.viewControllers.count - n];
[self popToViewController:popToVC animated:YES];
return YES;
}
// deal the gesture of return break off
- (void)dealInteractionChanges:(id<UIViewControllerTransitionCoordinatorContext>)context {
void (^animations) (UITransitionContextViewControllerKey) = ^(UITransitionContextViewControllerKey key){
UIViewController *vc = [context viewControllerForKey:key];
UIColor *curColor = [vc wr_navBarBarTintColor];
CGFloat curAlpha = [vc wr_navBarBackgroundAlpha];
[self setNeedsNavigationBarUpdateForBarTintColor:curColor];
[self setNeedsNavigationBarUpdateForBarBackgroundAlpha:curAlpha];
};
// after that, cancel the gesture of return
if ([context isCancelled] == YES) {
double cancelDuration = 0;
[UIView animateWithDuration:cancelDuration animations:^{
animations(UITransitionContextFromViewControllerKey);
}];
} else {
// after that, finish the gesture of return
double finishDuration = [context transitionDuration] * (1 - [context percentComplete]);
[UIView animateWithDuration:finishDuration animations:^{
animations(UITransitionContextToViewControllerKey);
}];
}
}
- (void)wr_updateInteractiveTransition:(CGFloat)percentComplete {
UIViewController *fromVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController *toVC = [self.topViewController.transitionCoordinator viewControllerForKey:UITransitionContextToViewControllerKey];
[self updateNavigationBarWithFromVC:fromVC toVC:toVC progress:percentComplete];
[self wr_updateInteractiveTransition:percentComplete];
}
@end
//==========================================================================
#pragma mark - UIViewController
//==========================================================================
@implementation UIViewController (WRAddition)
static char kWRPushToCurrentVCFinishedKey;
static char kWRPushToNextVCFinishedKey;
static char kWRNavBarBackgroundImageKey;
static char kWRNavBarBarTintColorKey;
static char kWRNavBarBackgroundAlphaKey;
static char kWRNavBarTintColorKey;
static char kWRNavBarTitleColorKey;
static char kWRStatusBarStyleKey;
static char kWRNavBarShadowImageHiddenKey;
static char kWRCustomNavBarKey;
static char kWRSystemNavBarBarTintColorKey;
static char kWRSystemNavBarTintColorKey;
static char kWRSystemNavBarTitleColorKey;
// navigationBar barTintColor can not change by currentVC before fromVC push to currentVC finished
- (BOOL)pushToCurrentVCFinished {
id isFinished = objc_getAssociatedObject(self, &kWRPushToCurrentVCFinishedKey);
return (isFinished != nil) ? [isFinished boolValue] : NO;
}
- (void)setPushToCurrentVCFinished:(BOOL)isFinished {
objc_setAssociatedObject(self, &kWRPushToCurrentVCFinishedKey, @(isFinished), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// navigationBar barTintColor can not change by currentVC when currentVC push to nextVC finished
- (BOOL)pushToNextVCFinished {
id isFinished = objc_getAssociatedObject(self, &kWRPushToNextVCFinishedKey);
return (isFinished != nil) ? [isFinished boolValue] : NO;
}
- (void)setPushToNextVCFinished:(BOOL)isFinished {
objc_setAssociatedObject(self, &kWRPushToNextVCFinishedKey, @(isFinished), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// navigationBar backgroundImage
- (UIImage *)wr_navBarBackgroundImage {
UIImage *image = (UIImage *)objc_getAssociatedObject(self, &kWRNavBarBackgroundImageKey);
image = (image == nil) ? [WRNavigationBar defaultNavBarBackgroundImage] : image;
return image;
}
- (void)wr_setNavBarBackgroundImage:(UIImage *)image {
if ([[self wr_customNavBar] isKindOfClass:[UINavigationBar class]]) {
// UINavigationBar *navBar = (UINavigationBar *)[self wr_customNavBar];
// [navBar wr_setBackgroundImage:image];
} else {
objc_setAssociatedObject(self, &kWRNavBarBackgroundImageKey, image, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
}
// navigationBar systemBarTintColor
- (UIColor *)wr_systemNavBarBarTintColor {
return (UIColor *)objc_getAssociatedObject(self, &kWRSystemNavBarBarTintColorKey);
}
- (void)wr_setSystemNavBarBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRSystemNavBarBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (UIColor *)wr_navBarBarTintColor {
UIColor *barTintColor = (UIColor *)objc_getAssociatedObject(self, &kWRNavBarBarTintColorKey);
if (![WRNavigationBar needUpdateNavigationBar:self]) {
if ([self wr_systemNavBarBarTintColor] == nil) {
barTintColor = self.navigationController.navigationBar.barTintColor;
} else {
barTintColor = [self wr_systemNavBarBarTintColor];
}
}
return (barTintColor != nil) ? barTintColor : [WRNavigationBar defaultNavBarBarTintColor];
}
- (void)wr_setNavBarBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRNavBarBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if ([[self wr_customNavBar] isKindOfClass:[UINavigationBar class]]) {
// UINavigationBar *navBar = (UINavigationBar *)[self wr_customNavBar];
// [navBar wr_setBackgroundColor:color];
} else {
BOOL isRootViewController = (self.navigationController.viewControllers.firstObject == self);
if (([self pushToCurrentVCFinished] == YES || isRootViewController == YES) && [self pushToNextVCFinished] == NO) {
[self.navigationController setNeedsNavigationBarUpdateForBarTintColor:color];
}
}
}
// navigationBar _UIBarBackground alpha
- (CGFloat)wr_navBarBackgroundAlpha {
id barBackgroundAlpha = objc_getAssociatedObject(self, &kWRNavBarBackgroundAlphaKey);
return (barBackgroundAlpha != nil) ? [barBackgroundAlpha floatValue] : [WRNavigationBar defaultNavBarBackgroundAlpha];
}
- (void)wr_setNavBarBackgroundAlpha:(CGFloat)alpha {
objc_setAssociatedObject(self, &kWRNavBarBackgroundAlphaKey, @(alpha), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if ([[self wr_customNavBar] isKindOfClass:[UINavigationBar class]]) {
// UINavigationBar *navBar = (UINavigationBar *)[self wr_customNavBar];
// [navBar wr_setBackgroundAlpha:alpha];
} else {
BOOL isRootViewController = (self.navigationController.viewControllers.firstObject == self);
if (([self pushToCurrentVCFinished] == YES || isRootViewController == YES) && [self pushToNextVCFinished] == NO) {
[self.navigationController setNeedsNavigationBarUpdateForBarBackgroundAlpha:alpha];
}
}
}
// navigationBar systemTintColor
- (UIColor *)wr_systemNavBarTintColor {
return (UIColor *)objc_getAssociatedObject(self, &kWRSystemNavBarTintColorKey);
}
- (void)wr_setSystemNavBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRSystemNavBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// navigationBar tintColor
- (UIColor *)wr_navBarTintColor {
UIColor *tintColor = (UIColor *)objc_getAssociatedObject(self, &kWRNavBarTintColorKey);
if (![WRNavigationBar needUpdateNavigationBar:self]) {
if ([self wr_systemNavBarTintColor] == nil) {
tintColor = self.navigationController.navigationBar.tintColor;
} else {
tintColor = [self wr_systemNavBarTintColor];
}
}
return (tintColor != nil) ? tintColor : [WRNavigationBar defaultNavBarTintColor];
}
- (void)wr_setNavBarTintColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRNavBarTintColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if ([[self wr_customNavBar] isKindOfClass:[UINavigationBar class]]) {
// UINavigationBar *navBar = (UINavigationBar *)[self wr_customNavBar];
// navBar.tintColor = color;
} else {
if ([self pushToNextVCFinished] == NO) {
[self.navigationController setNeedsNavigationBarUpdateForTintColor:color];
}
}
}
// navigationBar systemTitleColor
- (UIColor *)wr_systemNavBarTitleColor {
return (UIColor *)objc_getAssociatedObject(self, &kWRSystemNavBarTitleColorKey);
}
- (void)wr_setSystemNavBarTitleColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRSystemNavBarTitleColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
// navigationBarTitleColor
- (UIColor *)wr_navBarTitleColor {
UIColor *titleColor = (UIColor *)objc_getAssociatedObject(self, &kWRNavBarTitleColorKey);
if (![WRNavigationBar needUpdateNavigationBar:self]) {
if ([self wr_systemNavBarTitleColor] == nil) {
titleColor = self.navigationController.navigationBar.titleTextAttributes[@"NSColor"];
} else {
titleColor = [self wr_systemNavBarTitleColor];
}
}
return (titleColor != nil) ? titleColor : [WRNavigationBar defaultNavBarTitleColor];
}
- (void)wr_setNavBarTitleColor:(UIColor *)color {
objc_setAssociatedObject(self, &kWRNavBarTitleColorKey, color, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
if ([[self wr_customNavBar] isKindOfClass:[UINavigationBar class]]) {
// UINavigationBar *navBar = (UINavigationBar *)[self wr_customNavBar];
// navBar.titleTextAttributes = @{NSForegroundColorAttributeName:color};
} else {
if ([self pushToNextVCFinished] == NO) {
[self.navigationController setNeedsNavigationBarUpdateForTitleColor:color];
}
}
}
// statusBarStyle
- (UIStatusBarStyle)wr_statusBarStyle {
id style = objc_getAssociatedObject(self, &kWRStatusBarStyleKey);
return (style != nil) ? [style integerValue] : [WRNavigationBar defaultStatusBarStyle];
}
- (void)wr_setStatusBarStyle:(UIStatusBarStyle)style {
objc_setAssociatedObject(self, &kWRStatusBarStyleKey, @(style), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self setNeedsStatusBarAppearanceUpdate];
}
// shadowImage
- (void)wr_setNavBarShadowImageHidden:(BOOL)hidden {
objc_setAssociatedObject(self, &kWRNavBarShadowImageHiddenKey, @(hidden), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[self.navigationController setNeedsNavigationBarUpdateForShadowImageHidden:hidden];
}
- (BOOL)wr_navBarShadowImageHidden {
id hidden = objc_getAssociatedObject(self, &kWRNavBarShadowImageHiddenKey);
return (hidden != nil) ? [hidden boolValue] : [WRNavigationBar defaultNavBarShadowImageHidden];
}
// custom navigationBar
- (UIView *)wr_customNavBar {
UIView *navBar = objc_getAssociatedObject(self, &kWRCustomNavBarKey);
return (navBar != nil) ? navBar : [UIView new];
}
- (void)wr_setCustomNavBar:(UINavigationBar *)navBar {
objc_setAssociatedObject(self, &kWRCustomNavBarKey, navBar, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
+ (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
SEL needSwizzleSelectors[4] = {
@selector(viewWillAppear:),
@selector(viewWillDisappear:),
@selector(viewDidAppear:),
@selector(viewDidDisappear:)
};
for (int i = 0; i < 4; i++) {
SEL selector = needSwizzleSelectors[i];
NSString *newSelectorStr = [NSString stringWithFormat:@"wr_%@", NSStringFromSelector(selector)];
Method originMethod = class_getInstanceMethod(self, selector);
Method swizzledMethod = class_getInstanceMethod(self, NSSelectorFromString(newSelectorStr));
method_exchangeImplementations(originMethod, swizzledMethod);
}
});
}
- (void)wr_viewWillAppear:(BOOL)animated {
if ([self canUpdateNavigationBar]) {
if (![WRNavigationBar needUpdateNavigationBar:self]) {
if ([self wr_systemNavBarBarTintColor] == nil) {
[self wr_setSystemNavBarBarTintColor:[self wr_navBarBarTintColor]];
}
if ([self wr_systemNavBarTintColor] == nil) {
[self wr_setSystemNavBarTintColor:[self wr_navBarTintColor]];
}
if ([self wr_systemNavBarTitleColor] == nil) {
[self wr_setSystemNavBarTitleColor:[self wr_navBarTitleColor]];
}
[self.navigationController setNeedsNavigationBarUpdateForTintColor:[self wr_navBarTintColor]];
}
[self setPushToNextVCFinished:NO];
[self.navigationController setNeedsNavigationBarUpdateForTitleColor:[self wr_navBarTitleColor]];
}
[self wr_viewWillAppear:animated];
}
- (void)wr_viewWillDisappear:(BOOL)animated {
if ([self canUpdateNavigationBar] == YES) {
[self setPushToNextVCFinished:YES];
}
[self wr_viewWillDisappear:animated];
}
- (void)wr_viewDidAppear:(BOOL)animated
{
if ([self isRootViewController] == NO) {
self.pushToCurrentVCFinished = YES;
}
if ([self canUpdateNavigationBar] == YES)
{
UIImage *barBgImage = [self wr_navBarBackgroundImage];
if (barBgImage != nil) {
[self.navigationController setNeedsNavigationBarUpdateForBarBackgroundImage:barBgImage];
} else {
if ([WRNavigationBar needUpdateNavigationBar:self]) {
[self.navigationController setNeedsNavigationBarUpdateForBarTintColor:[self wr_navBarBarTintColor]];
}
}
[self.navigationController setNeedsNavigationBarUpdateForBarBackgroundAlpha:[self wr_navBarBackgroundAlpha]];
[self.navigationController setNeedsNavigationBarUpdateForTintColor:[self wr_navBarTintColor]];
[self.navigationController setNeedsNavigationBarUpdateForTitleColor:[self wr_navBarTitleColor]];
[self.navigationController setNeedsNavigationBarUpdateForShadowImageHidden:[self wr_navBarShadowImageHidden]];
}
[self wr_viewDidAppear:animated];
}
- (void)wr_viewDidDisappear:(BOOL)animated {
if (![WRNavigationBar needUpdateNavigationBar:self] && !self.navigationController) {
[self wr_setSystemNavBarBarTintColor:nil];
[self wr_setSystemNavBarTintColor:nil];
[self wr_setSystemNavBarTitleColor:nil];
}
[self wr_viewDidDisappear:animated];
}
- (BOOL)canUpdateNavigationBar {
return [self.navigationController.viewControllers containsObject:self];
}
- (BOOL)isRootViewController
{
UIViewController *rootViewController = self.navigationController.viewControllers.firstObject;
if ([rootViewController isKindOfClass:[UITabBarController class]] == NO) {
return rootViewController == self;
} else {
UITabBarController *tabBarController = (UITabBarController *)rootViewController;
return [tabBarController.viewControllers containsObject:self];
}
}
@end
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
</dict>
</plist>
//
// SceneDelegate.h
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
//
#import <UIKit/UIKit.h>
@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
@property (strong, nonatomic) UIWindow * window;
@end
//
// SceneDelegate.m
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
//
#import "SceneDelegate.h"
@interface SceneDelegate ()
@end
@implementation SceneDelegate
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
// Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
// If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
// This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
}
- (void)sceneDidDisconnect:(UIScene *)scene {
// Called as the scene is being released by the system.
// This occurs shortly after the scene enters the background, or when its session is discarded.
// Release any resources associated with this scene that can be re-created the next time the scene connects.
// The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
}
- (void)sceneDidBecomeActive:(UIScene *)scene {
// Called when the scene has moved from an inactive state to an active state.
// Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
}
- (void)sceneWillResignActive:(UIScene *)scene {
// Called when the scene will move from an active state to an inactive state.
// This may occur due to temporary interruptions (ex. an incoming phone call).
}
- (void)sceneWillEnterForeground:(UIScene *)scene {
// Called as the scene transitions from the background to the foreground.
// Use this method to undo the changes made on entering the background.
}
- (void)sceneDidEnterBackground:(UIScene *)scene {
// Called as the scene transitions from the foreground to the background.
// Use this method to save data, release shared resources, and store enough scene-specific state information
// to restore the scene back to its current state.
}
@end
//
// main.m
// kfw_ios_fastservice
//
// Created by xuning on 1/31/24.
//
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
//
// kfw_ios_fastserviceTests.m
// kfw_ios_fastserviceTests
//
// Created by xuning on 1/31/24.
//
#import <XCTest/XCTest.h>
@interface kfw_ios_fastserviceTests : XCTestCase
@end
@implementation kfw_ios_fastserviceTests
- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
- (void)testExample {
// This is an example of a functional test case.
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testPerformanceExample {
// This is an example of a performance test case.
[self measureBlock:^{
// Put the code you want to measure the time of here.
}];
}
@end
//
// kfw_ios_fastserviceUITests.m
// kfw_ios_fastserviceUITests
//
// Created by xuning on 1/31/24.
//
#import <XCTest/XCTest.h>
@interface kfw_ios_fastserviceUITests : XCTestCase
@end
@implementation kfw_ios_fastserviceUITests
- (void)setUp {
// Put setup code here. This method is called before the invocation of each test method in the class.
// In UI tests it is usually best to stop immediately when a failure occurs.
self.continueAfterFailure = NO;
// In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
}
- (void)tearDown {
// Put teardown code here. This method is called after the invocation of each test method in the class.
}
- (void)testExample {
// UI tests must launch the application that they test.
XCUIApplication *app = [[XCUIApplication alloc] init];
[app launch];
// Use XCTAssert and related functions to verify your tests produce the correct results.
}
- (void)testLaunchPerformance {
if (@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *)) {
// This measures how long it takes to launch your application.
[self measureWithMetrics:@[[[XCTApplicationLaunchMetric alloc] init]] block:^{
[[[XCUIApplication alloc] init] launch];
}];
}
}
@end
//
// kfw_ios_fastserviceUITestsLaunchTests.m
// kfw_ios_fastserviceUITests
//
// Created by xuning on 1/31/24.
//
#import <XCTest/XCTest.h>
@interface kfw_ios_fastserviceUITestsLaunchTests : XCTestCase
@end
@implementation kfw_ios_fastserviceUITestsLaunchTests
+ (BOOL)runsForEachTargetApplicationUIConfiguration {
return YES;
}
- (void)setUp {
self.continueAfterFailure = NO;
}
- (void)testLaunch {
XCUIApplication *app = [[XCUIApplication alloc] init];
[app launch];
// Insert steps here to perform after app launch but before taking a screenshot,
// such as logging into a test account or navigating somewhere in the app
XCTAttachment *attachment = [XCTAttachment attachmentWithScreenshot:XCUIScreen.mainScreen.screenshot];
attachment.name = @"Launch Screen";
attachment.lifetime = XCTAttachmentLifetimeKeepAlways;
[self addAttachment:attachment];
}
@end
# Uncomment the next line to define a global platform for your project
platform :ios, '9.0'
source 'https://github.com/CocoaPods/Specs.git'
target 'kfw_ios_fastservice' do
# Comment the next line if you don't want to use dynamic frameworks
use_frameworks!
pod 'AFNetworking'
pod 'Masonry'
pod 'MJRefresh'
pod 'YYKit'
pod 'MJExtension'
pod 'SDWebImage'
pod 'SAMKeychain'
pod 'MBProgressHUD'
pod 'LEEAlert'
pod 'AvoidCrash'
pod 'DZNEmptyDataSet'
pod 'BRPickerView'
pod "UINavigation-SXFixSpace"
pod 'Bugly'
pod 'BMKLocationKit'
pod 'BaiduNaviKit-All/Map', '6.4.0' # 集成地图Map包
pod 'BaiduNaviKit-All/Navi', '6.4.0' # 集成Navi包
pod 'BaiduNaviKit-All/WalkNavi', '6.4.0' # 集成WalkNavi包
# pod 'BaiduNaviKit-All/TTS', '6.0.0' # 集成TTS包
pod 'BaiduNaviKit-All/Search', '6.4.0' # 集成地图Search包
# pod 'BaiduNaviKit-All/Cloud', '6.0.0' # 集成地图Cloud包
pod 'BaiduNaviKit-All/Utils', '6.4.0' # 集成地图Utils包
target 'kfw_ios_fastserviceTests' do
inherit! :search_paths
# Pods for testing
end
target 'kfw_ios_fastserviceUITests' do
# Pods for testing
end
end
PODS:
- AFNetworking (4.0.1):
- AFNetworking/NSURLSession (= 4.0.1)
- AFNetworking/Reachability (= 4.0.1)
- AFNetworking/Security (= 4.0.1)
- AFNetworking/Serialization (= 4.0.1)
- AFNetworking/UIKit (= 4.0.1)
- AFNetworking/NSURLSession (4.0.1):
- AFNetworking/Reachability
- AFNetworking/Security
- AFNetworking/Serialization
- AFNetworking/Reachability (4.0.1)
- AFNetworking/Security (4.0.1)
- AFNetworking/Serialization (4.0.1)
- AFNetworking/UIKit (4.0.1):
- AFNetworking/NSURLSession
- AvoidCrash (2.5.2)
- BaiduNaviKit-All/Base (6.4.0)
- BaiduNaviKit-All/Map (6.4.0):
- BaiduNaviKit-All/Base
- BaiduNaviKit-All/Navi (6.4.0):
- BaiduNaviKit-All/Map
- BaiduNaviKit-All/Search (6.4.0):
- BaiduNaviKit-All/Base
- BaiduNaviKit-All/Utils (6.4.0):
- BaiduNaviKit-All/Base
- BaiduNaviKit-All/WalkNavi (6.4.0):
- BaiduNaviKit-All/Map
- BMKLocationKit (2.0.6)
- BRPickerView (2.8.0):
- BRPickerView/AddressPickerView (= 2.8.0)
- BRPickerView/Base (= 2.8.0)
- BRPickerView/DatePickerView (= 2.8.0)
- BRPickerView/StringPickerView (= 2.8.0)
- BRPickerView/AddressPickerView (2.8.0):
- BRPickerView/Base
- BRPickerView/Base (2.8.0)
- BRPickerView/DatePickerView (2.8.0):
- BRPickerView/Base
- BRPickerView/StringPickerView (2.8.0):
- BRPickerView/Base
- Bugly (2.5.93)
- DZNEmptyDataSet (1.8.1)
- LEEAlert (1.6.4)
- Masonry (1.1.0)
- MBProgressHUD (1.2.0)
- MJExtension (3.4.1)
- MJRefresh (3.7.5)
- SAMKeychain (1.5.3)
- SDWebImage (5.15.2):
- SDWebImage/Core (= 5.15.2)
- SDWebImage/Core (5.15.2)
- UINavigation-SXFixSpace (1.2.4)
- YYKit (1.0.9):
- YYKit/no-arc (= 1.0.9)
- YYKit/no-arc (1.0.9)
DEPENDENCIES:
- AFNetworking
- AvoidCrash
- BaiduNaviKit-All/Map (= 6.4.0)
- BaiduNaviKit-All/Navi (= 6.4.0)
- BaiduNaviKit-All/Search (= 6.4.0)
- BaiduNaviKit-All/Utils (= 6.4.0)
- BaiduNaviKit-All/WalkNavi (= 6.4.0)
- BMKLocationKit
- BRPickerView
- Bugly
- DZNEmptyDataSet
- LEEAlert
- Masonry
- MBProgressHUD
- MJExtension
- MJRefresh
- SAMKeychain
- SDWebImage
- UINavigation-SXFixSpace
- YYKit
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
- AFNetworking
- AvoidCrash
- BaiduNaviKit-All
- BMKLocationKit
- BRPickerView
- Bugly
- DZNEmptyDataSet
- LEEAlert
- Masonry
- MBProgressHUD
- MJExtension
- MJRefresh
- SAMKeychain
- SDWebImage
- UINavigation-SXFixSpace
- YYKit
SPEC CHECKSUMS:
AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58
AvoidCrash: 28c6916fe19bd2b84126b8dec7cbe61c9a12741d
BaiduNaviKit-All: 3024385b17c2d024e6be53d0ef46d4b50b032214
BMKLocationKit: 058df3f51b379be4b2865ee19bfb58c32398dc8a
BRPickerView: a0ff460bf092bc069db5a54153395b1f7e8f5300
Bugly: b8715e6ec4004b7f7fbffab0643ba80545aee3da
DZNEmptyDataSet: 9525833b9e68ac21c30253e1d3d7076cc828eaa7
LEEAlert: a604ad481e3e9b021421a271f78594926dd034bb
Masonry: 678fab65091a9290e40e2832a55e7ab731aad201
MBProgressHUD: 3ee5efcc380f6a79a7cc9b363dd669c5e1ae7406
MJExtension: 21c5f6f8c4d5d8844b7ae8fbae08fed0b501f961
MJRefresh: fdf5e979eb406a0341468932d1dfc8b7f9fce961
SAMKeychain: 483e1c9f32984d50ca961e26818a534283b4cd5c
SDWebImage: 8ab87d4b3e5cc4927bd47f78db6ceb0b94442577
UINavigation-SXFixSpace: 10f223253ebff2ceefa26694e23b7694269763c4
YYKit: 7cda43304a8dc3696c449041e2cb3107b4e236e7
PODFILE CHECKSUM: 707a9f75067f2737529bdb707d00e5248f0dc1e2
COCOAPODS: 1.11.3
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment