Commit b4cfb21c authored by 刘俊宏's avatar 刘俊宏

pod更新

parent deeb7bb0
This diff is collapsed.
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "EAAA1AD3A8A1B59AB91319EE40752C6D" BlueprintIdentifier = "EAAA1AD3A8A1B59AB91319EE40752C6D"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "99313990C1D76A6D1D017868B6975CC8" BlueprintIdentifier = "99313990C1D76A6D1D017868B6975CC8"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "F798030A13A5E43528C860AD809CD390" BlueprintIdentifier = "F798030A13A5E43528C860AD809CD390"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "00D9B51B84230E50370AC70ADCF7F8AA" BlueprintIdentifier = "00D9B51B84230E50370AC70ADCF7F8AA"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "B490E7485944099E16C9CBD79119D1D4" BlueprintIdentifier = "B490E7485944099E16C9CBD79119D1D4"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1100"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES">
<BuildActionEntries>
<BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "E8572772A2B42B68FDF351C752B8A238"
BuildableName = "JZLocationConverter.framework"
BlueprintName = "JZLocationConverter"
ReferencedContainer = "container:Pods.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
buildConfiguration = "Debug">
<AdditionalOptions>
</AdditionalOptions>
</TestAction>
<LaunchAction
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction>
<ProfileAction
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "E8022D22FAA6690B5E1C379C1BCE1491" BlueprintIdentifier = "E8022D22FAA6690B5E1C379C1BCE1491"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "FD999FE212F29E29DEEA0A85E1DC4D4E" BlueprintIdentifier = "FD999FE212F29E29DEEA0A85E1DC4D4E"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "6868056D761E163D10FDAF8CF1C4D9B8" BlueprintIdentifier = "6868056D761E163D10FDAF8CF1C4D9B8"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "162E649F50FEC62B61BDD87D1BD422B4" BlueprintIdentifier = "162E649F50FEC62B61BDD87D1BD422B4"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "8CEEFD1CB630CA790F0396E2E24A4C8C" BlueprintIdentifier = "8CEEFD1CB630CA790F0396E2E24A4C8C"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "19622742EBA51E823D6DAE3F8CDBFAD4" BlueprintIdentifier = "19622742EBA51E823D6DAE3F8CDBFAD4"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "6038CE6006EFBE9D905454CF01909C42" BlueprintIdentifier = "6038CE6006EFBE9D905454CF01909C42"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "5D8BB851D938AE8F1A461F95C1ABD69B" BlueprintIdentifier = "5D8BB851D938AE8F1A461F95C1ABD69B"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "D118A6A04828FD3CDA8640CD2B6796D2" BlueprintIdentifier = "D118A6A04828FD3CDA8640CD2B6796D2"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "91BFC2827E7E6E2B51AB2CFF58AC6317" BlueprintIdentifier = "91BFC2827E7E6E2B51AB2CFF58AC6317"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<Scheme <Scheme
LastUpgradeVersion = "1200" LastUpgradeVersion = "1100"
version = "1.3"> version = "1.3">
<BuildAction <BuildAction
parallelizeBuildables = "YES" parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"> buildImplicitDependencies = "YES">
<BuildActionEntries> <BuildActionEntries>
<BuildActionEntry <BuildActionEntry
buildForAnalyzing = "YES"
buildForTesting = "YES" buildForTesting = "YES"
buildForRunning = "YES" buildForRunning = "YES"
buildForProfiling = "YES" buildForProfiling = "YES"
buildForArchiving = "YES" buildForArchiving = "YES">
buildForAnalyzing = "YES">
<BuildableReference <BuildableReference
BuildableIdentifier = "primary" BuildableIdentifier = "primary"
BlueprintIdentifier = "930887923DC0E8AC2A3589A7987F2BDD" BlueprintIdentifier = "930887923DC0E8AC2A3589A7987F2BDD"
...@@ -23,15 +23,14 @@ ...@@ -23,15 +23,14 @@
</BuildActionEntries> </BuildActionEntries>
</BuildAction> </BuildAction>
<TestAction <TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"> shouldUseLaunchSchemeArgsEnv = "YES"
<Testables> buildConfiguration = "Debug">
</Testables> <AdditionalOptions>
</AdditionalOptions>
</TestAction> </TestAction>
<LaunchAction <LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0" launchStyle = "0"
...@@ -39,14 +38,17 @@ ...@@ -39,14 +38,17 @@
ignoresPersistentStateOnLaunch = "NO" ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES" debugDocumentVersioning = "YES"
debugServiceExtension = "internal" debugServiceExtension = "internal"
buildConfiguration = "Debug"
allowLocationSimulation = "YES"> allowLocationSimulation = "YES">
<AdditionalOptions>
</AdditionalOptions>
</LaunchAction> </LaunchAction>
<ProfileAction <ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = "" savedToolIdentifier = ""
useCustomWorkingDirectory = "NO" useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES"> debugDocumentVersioning = "YES"
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES">
</ProfileAction> </ProfileAction>
<AnalyzeAction <AnalyzeAction
buildConfiguration = "Debug"> buildConfiguration = "Debug">
......
...@@ -8,139 +8,101 @@ ...@@ -8,139 +8,101 @@
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>1</integer>
</dict> </dict>
<key>CryptoSwift.xcscheme</key> <key>CryptoSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>2</integer>
</dict> </dict>
<key>Dollar.xcscheme</key> <key>Dollar.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>3</integer>
</dict> </dict>
<key>ESTabBarController-swift.xcscheme</key> <key>ESTabBarController-swift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>4</integer>
</dict> </dict>
<key>Hue.xcscheme</key> <key>Hue.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>5</integer>
</dict> </dict>
<key>IQKeyboardManagerSwift.xcscheme</key> <key>IQKeyboardManagerSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>6</integer>
</dict> </dict>
<key>JZLocationConverter.xcscheme_^#shared#^_</key> <key>JZLocationConverter.xcscheme</key>
<dict> <dict>
<key>orderHint</key> <key>isShown</key>
<integer>20</integer> <false/>
</dict> </dict>
<key>Kingfisher.xcscheme</key> <key>Kingfisher.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>7</integer>
</dict> </dict>
<key>LGButton.xcscheme</key> <key>LGButton.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>8</integer>
</dict> </dict>
<key>MJRefresh.xcscheme</key> <key>MJRefresh.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>9</integer>
</dict> </dict>
<key>ObjectMapper.xcscheme</key> <key>ObjectMapper.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>10</integer>
</dict> </dict>
<key>Pods-GeliBusinessPlatform.xcscheme</key> <key>Pods-GeliBusinessPlatform.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>11</integer>
</dict> </dict>
<key>ReachabilitySwift.xcscheme</key> <key>ReachabilitySwift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>12</integer>
</dict> </dict>
<key>SkeletonView.xcscheme</key> <key>SkeletonView.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>13</integer>
</dict> </dict>
<key>SnapKit.xcscheme</key> <key>SnapKit.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>14</integer>
</dict> </dict>
<key>SwiftDate.xcscheme</key> <key>SwiftDate.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>15</integer>
</dict> </dict>
<key>SwifterSwift.xcscheme</key> <key>SwifterSwift.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>16</integer>
</dict> </dict>
<key>SwiftyJSON.xcscheme</key> <key>SwiftyJSON.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>17</integer>
</dict> </dict>
<key>ViewAnimator.xcscheme</key> <key>ViewAnimator.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>18</integer>
</dict> </dict>
<key>WYAutoLayout.xcscheme</key> <key>WYAutoLayout.xcscheme</key>
<dict> <dict>
<key>isShown</key> <key>isShown</key>
<false/> <false/>
<key>orderHint</key>
<integer>19</integer>
</dict> </dict>
</dict> </dict>
<key>SuppressBuildableAutocreation</key> <key>SuppressBuildableAutocreation</key>
......
This diff is collapsed.
...@@ -22,7 +22,7 @@ class SkeletonViewAppearance: Appearance { ...@@ -22,7 +22,7 @@ class SkeletonViewAppearance: Appearance {
var tintColor: UIColor = .skeletonDefault var tintColor: UIColor = .skeletonDefault
var gradient: SkeletonGradient = SkeletonGradient(baseColor: .skeletonDefault) var gradient = SkeletonGradient(baseColor: .skeletonDefault)
var multilineHeight: CGFloat = 15 var multilineHeight: CGFloat = 15
......
...@@ -9,25 +9,30 @@ class SkeletonLayerBuilder { ...@@ -9,25 +9,30 @@ class SkeletonLayerBuilder {
var colors: [UIColor] = [] var colors: [UIColor] = []
var holder: UIView? var holder: UIView?
@discardableResult
func setSkeletonType(_ type: SkeletonType) -> SkeletonLayerBuilder { func setSkeletonType(_ type: SkeletonType) -> SkeletonLayerBuilder {
self.skeletonType = type self.skeletonType = type
return self return self
} }
@discardableResult
func addColor(_ color: UIColor) -> SkeletonLayerBuilder { func addColor(_ color: UIColor) -> SkeletonLayerBuilder {
return addColors([color]) return addColors([color])
} }
@discardableResult
func addColors(_ colors: [UIColor]) -> SkeletonLayerBuilder { func addColors(_ colors: [UIColor]) -> SkeletonLayerBuilder {
self.colors.append(contentsOf: colors) self.colors.append(contentsOf: colors)
return self return self
} }
@discardableResult
func setHolder(_ holder: UIView) -> SkeletonLayerBuilder { func setHolder(_ holder: UIView) -> SkeletonLayerBuilder {
self.holder = holder self.holder = holder
return self return self
} }
@discardableResult
func build() -> SkeletonLayer? { func build() -> SkeletonLayer? {
guard let type = skeletonType, guard let type = skeletonType,
let holder = holder let holder = holder
......
...@@ -12,41 +12,55 @@ class SkeletonMultilineLayerBuilder { ...@@ -12,41 +12,55 @@ class SkeletonMultilineLayerBuilder {
var cornerRadius: Int? var cornerRadius: Int?
var multilineSpacing: CGFloat = SkeletonAppearance.default.multilineSpacing var multilineSpacing: CGFloat = SkeletonAppearance.default.multilineSpacing
var paddingInsets: UIEdgeInsets = .zero var paddingInsets: UIEdgeInsets = .zero
var isRTL: Bool = false
@discardableResult
func setSkeletonType(_ type: SkeletonType) -> SkeletonMultilineLayerBuilder { func setSkeletonType(_ type: SkeletonType) -> SkeletonMultilineLayerBuilder {
self.skeletonType = type self.skeletonType = type
return self return self
} }
@discardableResult
func setIndex(_ index: Int) -> SkeletonMultilineLayerBuilder { func setIndex(_ index: Int) -> SkeletonMultilineLayerBuilder {
self.index = index self.index = index
return self return self
} }
@discardableResult
func setHeight(_ height: CGFloat) -> SkeletonMultilineLayerBuilder { func setHeight(_ height: CGFloat) -> SkeletonMultilineLayerBuilder {
self.height = height self.height = height
return self return self
} }
@discardableResult
func setWidth(_ width: CGFloat) -> SkeletonMultilineLayerBuilder { func setWidth(_ width: CGFloat) -> SkeletonMultilineLayerBuilder {
self.width = width self.width = width
return self return self
} }
@discardableResult
func setCornerRadius(_ radius: Int) -> SkeletonMultilineLayerBuilder { func setCornerRadius(_ radius: Int) -> SkeletonMultilineLayerBuilder {
self.cornerRadius = radius self.cornerRadius = radius
return self return self
} }
@discardableResult
func setMultilineSpacing(_ spacing: CGFloat) -> SkeletonMultilineLayerBuilder { func setMultilineSpacing(_ spacing: CGFloat) -> SkeletonMultilineLayerBuilder {
self.multilineSpacing = spacing self.multilineSpacing = spacing
return self return self
} }
@discardableResult
func setPadding(_ insets: UIEdgeInsets) -> SkeletonMultilineLayerBuilder { func setPadding(_ insets: UIEdgeInsets) -> SkeletonMultilineLayerBuilder {
self.paddingInsets = insets self.paddingInsets = insets
return self return self
} }
@discardableResult
func setIsRTL(_ isRTL: Bool) -> SkeletonMultilineLayerBuilder {
self.isRTL = isRTL
return self
}
func build() -> CALayer? { func build() -> CALayer? {
guard let type = skeletonType, guard let type = skeletonType,
...@@ -59,7 +73,11 @@ class SkeletonMultilineLayerBuilder { ...@@ -59,7 +73,11 @@ class SkeletonMultilineLayerBuilder {
let layer = type.layer let layer = type.layer
layer.anchorPoint = .zero layer.anchorPoint = .zero
layer.name = CALayer.skeletonSubLayersName layer.name = CALayer.skeletonSubLayersName
layer.updateLayerFrame(for: index, size: CGSize(width: width, height: height), multilineSpacing: self.multilineSpacing, paddingInsets: paddingInsets) layer.updateLayerFrame(for: index,
size: CGSize(width: width, height: height),
multilineSpacing: multilineSpacing,
paddingInsets: paddingInsets,
isRTL: isRTL)
layer.cornerRadius = CGFloat(radius) layer.cornerRadius = CGFloat(radius)
layer.masksToBounds = true layer.masksToBounds = true
......
...@@ -8,7 +8,6 @@ ...@@ -8,7 +8,6 @@
import UIKit import UIKit
public protocol SkeletonCollectionViewDataSource: UICollectionViewDataSource { public protocol SkeletonCollectionViewDataSource: UICollectionViewDataSource {
func numSections(in collectionSkeletonView: UICollectionView) -> Int func numSections(in collectionSkeletonView: UICollectionView) -> Int
func collectionSkeletonView(_ skeletonView: UICollectionView, numberOfItemsInSection section: Int) -> Int func collectionSkeletonView(_ skeletonView: UICollectionView, numberOfItemsInSection section: Int) -> Int
...@@ -31,4 +30,3 @@ public extension SkeletonCollectionViewDataSource { ...@@ -31,4 +30,3 @@ public extension SkeletonCollectionViewDataSource {
} }
public protocol SkeletonCollectionViewDelegate: UICollectionViewDelegate { } public protocol SkeletonCollectionViewDelegate: UICollectionViewDelegate { }
...@@ -11,7 +11,7 @@ import UIKit ...@@ -11,7 +11,7 @@ import UIKit
extension UICollectionView: CollectionSkeleton { extension UICollectionView: CollectionSkeleton {
var estimatedNumberOfRows: Int { var estimatedNumberOfRows: Int {
guard let flowlayout = collectionViewLayout as? UICollectionViewFlowLayout else { return 0 } guard let flowlayout = collectionViewLayout as? UICollectionViewFlowLayout else { return 0 }
return Int(ceil(frame.height/flowlayout.itemSize.height)) return Int(ceil(frame.height / flowlayout.itemSize.height))
} }
var skeletonDataSource: SkeletonCollectionDataSource? { var skeletonDataSource: SkeletonCollectionDataSource? {
...@@ -70,7 +70,7 @@ public extension UICollectionView { ...@@ -70,7 +70,7 @@ public extension UICollectionView {
self.skeletonDataSource = dataSource self.skeletonDataSource = dataSource
performBatchUpdates({ performBatchUpdates({
self.reloadData() self.reloadData()
}) { (done) in }) { done in
completion(done) completion(done)
} }
......
...@@ -63,9 +63,8 @@ extension SkeletonCollectionDataSource: UICollectionViewDataSource { ...@@ -63,9 +63,8 @@ extension SkeletonCollectionDataSource: UICollectionViewDataSource {
func collectionView(_ collectionView: UICollectionView, func collectionView(_ collectionView: UICollectionView,
viewForSupplementaryElementOfKind kind: String, viewForSupplementaryElementOfKind kind: String,
at indexPath: IndexPath) -> UICollectionReusableView { at indexPath: IndexPath) -> UICollectionReusableView {
if let viewIdentifier = originalCollectionViewDataSource?.collectionSkeletonView(collectionView, supplementaryViewIdentifierOfKind: kind, at: indexPath) { if let viewIdentifier = originalCollectionViewDataSource?.collectionSkeletonView(collectionView, supplementaryViewIdentifierOfKind: kind, at: indexPath) {
let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: viewIdentifier, for: indexPath) let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: viewIdentifier, for: indexPath)
skeletonViewIfContainerSkeletonIsActive(container: collectionView, view: view) skeletonViewIfContainerSkeletonIsActive(container: collectionView, view: view)
return view return view
} }
......
...@@ -23,7 +23,6 @@ extension SkeletonCollectionDelegate: UITableViewDelegate { ...@@ -23,7 +23,6 @@ extension SkeletonCollectionDelegate: UITableViewDelegate {
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if let viewIdentifier = originalTableViewDelegate?.collectionSkeletonView(tableView, identifierForHeaderInSection: section), if let viewIdentifier = originalTableViewDelegate?.collectionSkeletonView(tableView, identifierForHeaderInSection: section),
let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: viewIdentifier) { let header = tableView.dequeueReusableHeaderFooterView(withIdentifier: viewIdentifier) {
skeletonViewIfContainerSkeletonIsActive(container: tableView, view: header) skeletonViewIfContainerSkeletonIsActive(container: tableView, view: header)
return header return header
} }
...@@ -34,7 +33,6 @@ extension SkeletonCollectionDelegate: UITableViewDelegate { ...@@ -34,7 +33,6 @@ extension SkeletonCollectionDelegate: UITableViewDelegate {
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
if let viewIdentifier = originalTableViewDelegate?.collectionSkeletonView(tableView, identifierForFooterInSection: section), if let viewIdentifier = originalTableViewDelegate?.collectionSkeletonView(tableView, identifierForFooterInSection: section),
let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: viewIdentifier) { let footer = tableView.dequeueReusableHeaderFooterView(withIdentifier: viewIdentifier) {
skeletonViewIfContainerSkeletonIsActive(container: tableView, view: footer) skeletonViewIfContainerSkeletonIsActive(container: tableView, view: footer)
return footer return footer
} }
......
...@@ -12,7 +12,7 @@ public typealias ReusableHeaderFooterIdentifier = String ...@@ -12,7 +12,7 @@ public typealias ReusableHeaderFooterIdentifier = String
extension UITableView: CollectionSkeleton { extension UITableView: CollectionSkeleton {
var estimatedNumberOfRows: Int { var estimatedNumberOfRows: Int {
return Int(ceil(frame.height/rowHeight)) return Int(ceil(frame.height / rowHeight))
} }
var skeletonDataSource: SkeletonCollectionDataSource? { var skeletonDataSource: SkeletonCollectionDataSource? {
...@@ -43,8 +43,7 @@ extension UITableView: CollectionSkeleton { ...@@ -43,8 +43,7 @@ extension UITableView: CollectionSkeleton {
self.skeletonDataSource = dataSource self.skeletonDataSource = dataSource
if let originalDelegate = self.delegate as? SkeletonTableViewDelegate, if let originalDelegate = self.delegate as? SkeletonTableViewDelegate,
!(originalDelegate is SkeletonCollectionDelegate) !(originalDelegate is SkeletonCollectionDelegate) {
{
let delegate = SkeletonCollectionDelegate(tableViewDelegate: originalDelegate) let delegate = SkeletonCollectionDelegate(tableViewDelegate: originalDelegate)
self.skeletonDelegate = delegate self.skeletonDelegate = delegate
} }
......
// Copyright © 2018 SkeletonView. All rights reserved. // Copyright © 2018 SkeletonView. All rights reserved.
import Foundation import Foundation
...@@ -10,6 +9,7 @@ enum SkeletonEnvironmentKey: String { ...@@ -10,6 +9,7 @@ enum SkeletonEnvironmentKey: String {
extension Dictionary { extension Dictionary {
subscript (_ key: SkeletonEnvironmentKey) -> Value? { subscript (_ key: SkeletonEnvironmentKey) -> Value? {
// swiftlint:disable:next force_cast
return self[key.rawValue as! Key] return self[key.rawValue as! Key]
} }
} }
...@@ -19,7 +19,7 @@ func printSkeletonHierarchy(in view: UIView) { ...@@ -19,7 +19,7 @@ func printSkeletonHierarchy(in view: UIView) {
} }
func skeletonLog(_ message: String) { func skeletonLog(_ message: String) {
if let _ = ProcessInfo.processInfo.environment[.debugMode] { if ProcessInfo.processInfo.environment[.debugMode] != nil {
print(message) print(message)
} }
} }
...@@ -28,7 +28,7 @@ extension UIView { ...@@ -28,7 +28,7 @@ extension UIView {
public var skeletonDescription: String { public var skeletonDescription: String {
var description = "<\(type(of: self)): \(Unmanaged.passUnretained(self).toOpaque())" var description = "<\(type(of: self)): \(Unmanaged.passUnretained(self).toOpaque())"
let subSkeletons = subviewsSkeletonables let subSkeletons = subviewsSkeletonables
if subSkeletons.count != 0 { if !subSkeletons.isEmpty {
description += " | (\(subSkeletons.count)) subSkeletons" description += " | (\(subSkeletons.count)) subSkeletons"
} }
if isSkeletonable { if isSkeletonable {
......
...@@ -30,15 +30,23 @@ extension CAGradientLayer { ...@@ -30,15 +30,23 @@ extension CAGradientLayer {
struct SkeletonMultilinesLayerConfig { struct SkeletonMultilinesLayerConfig {
var lines: Int var lines: Int
var lineHeight: CGFloat? = nil var lineHeight: CGFloat
var type: SkeletonType var type: SkeletonType
var lastLineFillPercent: Int var lastLineFillPercent: Int
var multilineCornerRadius: Int var multilineCornerRadius: Int
var multilineSpacing: CGFloat var multilineSpacing: CGFloat
var paddingInsets: UIEdgeInsets var paddingInsets: UIEdgeInsets
var isRTL: Bool
/// Returns padding insets taking into account if the RTL is activated
var calculatedPaddingInsets: UIEdgeInsets {
UIEdgeInsets(top: paddingInsets.top,
left: isRTL ? paddingInsets.right : paddingInsets.left,
bottom: paddingInsets.bottom,
right: isRTL ? paddingInsets.left : paddingInsets.right)
}
} }
// MARK: Skeleton sublayers // MARK: Skeleton sublayers
extension CALayer { extension CALayer {
static let skeletonSubLayersName = "SkeletonSubLayersName" static let skeletonSubLayersName = "SkeletonSubLayersName"
...@@ -48,9 +56,10 @@ extension CALayer { ...@@ -48,9 +56,10 @@ extension CALayer {
} }
func addMultilinesLayers(for config: SkeletonMultilinesLayerConfig) { func addMultilinesLayers(for config: SkeletonMultilinesLayerConfig) {
let numberOfSublayers = config.lines == 1 ? 1 : calculateNumLines(for: config) let numberOfSublayers = config.lines > 0 ? config.lines : calculateNumLines(for: config)
var height = config.lineHeight ?? SkeletonAppearance.default.multilineHeight var height = config.lineHeight
if numberOfSublayers == 1 {
if numberOfSublayers == 1 && SkeletonAppearance.default.renderSingleLineAsView {
height = bounds.height height = bounds.height
} }
...@@ -60,6 +69,7 @@ extension CALayer { ...@@ -60,6 +69,7 @@ extension CALayer {
.setMultilineSpacing(config.multilineSpacing) .setMultilineSpacing(config.multilineSpacing)
.setPadding(config.paddingInsets) .setPadding(config.paddingInsets)
.setHeight(height) .setHeight(height)
.setIsRTL(config.isRTL)
(0..<numberOfSublayers).forEach { index in (0..<numberOfSublayers).forEach { index in
let width = calculatedWidthForLine(at: index, totalLines: numberOfSublayers, lastLineFillPercent: config.lastLineFillPercent, paddingInsets: config.paddingInsets) let width = calculatedWidthForLine(at: index, totalLines: numberOfSublayers, lastLineFillPercent: config.lastLineFillPercent, paddingInsets: config.paddingInsets)
...@@ -76,16 +86,21 @@ extension CALayer { ...@@ -76,16 +86,21 @@ extension CALayer {
let currentSkeletonSublayers = skeletonSublayers let currentSkeletonSublayers = skeletonSublayers
let numberOfSublayers = currentSkeletonSublayers.count let numberOfSublayers = currentSkeletonSublayers.count
let lastLineFillPercent = config.lastLineFillPercent let lastLineFillPercent = config.lastLineFillPercent
let paddingInsets = config.paddingInsets let paddingInsets = config.calculatedPaddingInsets
let multilineSpacing = config.multilineSpacing let multilineSpacing = config.multilineSpacing
var height = config.lineHeight ?? SkeletonAppearance.default.multilineHeight var height = config.lineHeight
if numberOfSublayers == 1 {
if numberOfSublayers == 1 && SkeletonAppearance.default.renderSingleLineAsView {
height = bounds.height height = bounds.height
} }
for (index, layer) in currentSkeletonSublayers.enumerated() { for (index, layer) in currentSkeletonSublayers.enumerated() {
let width = calculatedWidthForLine(at: index, totalLines: numberOfSublayers, lastLineFillPercent: lastLineFillPercent, paddingInsets: paddingInsets) let width = calculatedWidthForLine(at: index, totalLines: numberOfSublayers, lastLineFillPercent: lastLineFillPercent, paddingInsets: paddingInsets)
layer.updateLayerFrame(for: index, size: CGSize(width: width, height: height), multilineSpacing: multilineSpacing, paddingInsets: paddingInsets) layer.updateLayerFrame(for: index,
size: CGSize(width: width, height: height),
multilineSpacing: multilineSpacing,
paddingInsets: paddingInsets,
isRTL: config.isRTL)
} }
} }
...@@ -97,16 +112,38 @@ extension CALayer { ...@@ -97,16 +112,38 @@ extension CALayer {
return width return width
} }
func updateLayerFrame(for index: Int, size: CGSize, multilineSpacing: CGFloat, paddingInsets: UIEdgeInsets) { func updateLayerFrame(for index: Int, size: CGSize, multilineSpacing: CGFloat, paddingInsets: UIEdgeInsets, isRTL: Bool) {
let spaceRequiredForEachLine = SkeletonAppearance.default.multilineHeight + multilineSpacing let spaceRequiredForEachLine = size.height + multilineSpacing
frame = CGRect(x: paddingInsets.left, y: CGFloat(index) * spaceRequiredForEachLine + paddingInsets.top, width: size.width, height: size.height) let newFrame = CGRect(x: paddingInsets.left,
y: CGFloat(index) * spaceRequiredForEachLine + paddingInsets.top,
width: size.width,
height: size.height)
frame = flipRectForRTLIfNeeded(newFrame, isRTL: isRTL)
} }
private func calculateNumLines(for config: SkeletonMultilinesLayerConfig) -> Int { private func calculateNumLines(for config: SkeletonMultilinesLayerConfig) -> Int {
let requiredSpaceForEachLine = (config.lineHeight ?? SkeletonAppearance.default.multilineHeight) + config.multilineSpacing let definedNumberOfLines = config.lines
var numberOfSublayers = Int(round(CGFloat(bounds.height - config.paddingInsets.top - config.paddingInsets.bottom)/CGFloat(requiredSpaceForEachLine))) let requiredSpaceForEachLine = config.lineHeight + config.multilineSpacing
if config.lines != 0, config.lines <= numberOfSublayers { numberOfSublayers = config.lines } let calculatedNumberOfLines = Int(round(CGFloat(bounds.height - config.paddingInsets.top - config.paddingInsets.bottom) / CGFloat(requiredSpaceForEachLine)))
return numberOfSublayers
guard calculatedNumberOfLines > 0 else {
return 1
}
if definedNumberOfLines > 0, definedNumberOfLines <= calculatedNumberOfLines {
return definedNumberOfLines
}
return calculatedNumberOfLines
}
private func flipRectForRTLIfNeeded(_ rect: CGRect, isRTL: Bool) -> CGRect {
var newRect = rect
if isRTL {
newRect.origin.x = (superlayer?.bounds.width ?? 0) - rect.origin.x - rect.width
}
return newRect
} }
} }
...@@ -115,6 +152,7 @@ public extension CALayer { ...@@ -115,6 +152,7 @@ public extension CALayer {
var pulse: CAAnimation { var pulse: CAAnimation {
let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.backgroundColor)) let pulseAnimation = CABasicAnimation(keyPath: #keyPath(CALayer.backgroundColor))
pulseAnimation.fromValue = backgroundColor pulseAnimation.fromValue = backgroundColor
//swiftlint:disable:next force_unwrapping
pulseAnimation.toValue = UIColor(cgColor: backgroundColor!).complementaryColor.cgColor pulseAnimation.toValue = UIColor(cgColor: backgroundColor!).complementaryColor.cgColor
pulseAnimation.duration = 1 pulseAnimation.duration = 1
pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut) pulseAnimation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeInEaseOut)
...@@ -124,25 +162,6 @@ public extension CALayer { ...@@ -124,25 +162,6 @@ public extension CALayer {
return pulseAnimation return pulseAnimation
} }
var sliding: CAAnimation {
let startPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint))
startPointAnim.fromValue = CGPoint(x: -1, y: 0.5)
startPointAnim.toValue = CGPoint(x:1, y: 0.5)
let endPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.endPoint))
endPointAnim.fromValue = CGPoint(x: 0, y: 0.5)
endPointAnim.toValue = CGPoint(x:2, y: 0.5)
let animGroup = CAAnimationGroup()
animGroup.animations = [startPointAnim, endPointAnim]
animGroup.duration = 1.5
animGroup.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn)
animGroup.repeatCount = .infinity
animGroup.isRemovedOnCompletion = false
return animGroup
}
func playAnimation(_ anim: SkeletonLayerAnimation, key: String, completion: (() -> Void)? = nil) { func playAnimation(_ anim: SkeletonLayerAnimation, key: String, completion: (() -> Void)? = nil) {
skeletonSublayers.recursiveSearch(leafBlock: { skeletonSublayers.recursiveSearch(leafBlock: {
DispatchQueue.main.async { CATransaction.begin() } DispatchQueue.main.async { CATransaction.begin() }
......
...@@ -22,7 +22,7 @@ extension UIColor { ...@@ -22,7 +22,7 @@ extension UIColor {
public var complementaryColor: UIColor { public var complementaryColor: UIColor {
if #available(iOS 13, tvOS 13, *) { if #available(iOS 13, tvOS 13, *) {
return UIColor { traitCollection in return UIColor { _ in
return self.isLight() ? self.darker : self.lighter return self.isLight() ? self.darker : self.lighter
} }
} else { } else {
...@@ -50,6 +50,7 @@ extension UIColor { ...@@ -50,6 +50,7 @@ extension UIColor {
} }
public extension UIColor { public extension UIColor {
// swiftlint:disable operator_usage_whitespace
static var greenSea = UIColor(0x16a085) static var greenSea = UIColor(0x16a085)
static var turquoise = UIColor(0x1abc9c) static var turquoise = UIColor(0x1abc9c)
static var emerald = UIColor(0x2ecc71) static var emerald = UIColor(0x2ecc71)
...@@ -71,13 +72,16 @@ public extension UIColor { ...@@ -71,13 +72,16 @@ public extension UIColor {
static var pomegranate = UIColor(0xc0392b) static var pomegranate = UIColor(0xc0392b)
static var silver = UIColor(0xbdc3c7) static var silver = UIColor(0xbdc3c7)
static var asbestos = UIColor(0x7f8c8d) static var asbestos = UIColor(0x7f8c8d)
// swiftlint:enable operator_usage_whitespace
static var skeletonDefault: UIColor { static var skeletonDefault: UIColor {
if #available(iOS 13, tvOS 13, *) { if #available(iOS 13, tvOS 13, *) {
return UIColor { traitCollection in return UIColor { traitCollection in
switch traitCollection.userInterfaceStyle { switch traitCollection.userInterfaceStyle {
case .dark: return .darkClouds case .dark:
default: return .clouds return .darkClouds
default:
return .clouds
} }
} }
} else { } else {
......
...@@ -13,15 +13,13 @@ extension UITableView { ...@@ -13,15 +13,13 @@ extension UITableView {
headerRect = rectForHeader(inSection: $1) headerRect = rectForHeader(inSection: $1)
} }
if headerRect != nil { if let headerRect = headerRect {
let visiblePartOfTableView: CGRect = CGRect( let visiblePartOfTableView = CGRect(x: contentOffset.x,
x: contentOffset.x, y: contentOffset.y,
y: contentOffset.y, width: bounds.size.width,
width: bounds.size.width, height: bounds.size.height)
height: bounds.size.height
)
if (visiblePartOfTableView.intersects(headerRect!)) { if visiblePartOfTableView.intersects(headerRect) {
return $0 + [$1] return $0 + [$1]
} }
} }
......
// Copyright © 2020 SkeletonView. All rights reserved.
import UIKit
// MARK: Frame
extension UIView {
var widthConstraints: [NSLayoutConstraint] {
nonContentSizeLayoutConstraints.filter { $0.firstAttribute == NSLayoutConstraint.Attribute.width }
}
var heightConstraints: [NSLayoutConstraint] {
nonContentSizeLayoutConstraints.filter { $0.firstAttribute == NSLayoutConstraint.Attribute.height }
}
@discardableResult
func setHeight(equalToConstant constant: CGFloat) -> NSLayoutConstraint {
let heightConstraint = heightAnchor.constraint(equalToConstant: constant)
NSLayoutConstraint.activate([heightConstraint])
return heightConstraint
}
var nonContentSizeLayoutConstraints: [NSLayoutConstraint] {
constraints.filter({ "\(type(of: $0))" != "NSContentSizeLayoutConstraint" })
}
}
...@@ -5,6 +5,7 @@ import UIKit ...@@ -5,6 +5,7 @@ import UIKit
// codebeat:disable[TOO_MANY_IVARS] // codebeat:disable[TOO_MANY_IVARS]
enum ViewAssociatedKeys { enum ViewAssociatedKeys {
static var skeletonable = "skeletonable" static var skeletonable = "skeletonable"
static var hiddenWhenSkeletonIsActive = "hiddenWhenSkeletonIsActive"
static var status = "status" static var status = "status"
static var skeletonLayer = "layer" static var skeletonLayer = "layer"
static var flowDelegate = "flowDelegate" static var flowDelegate = "flowDelegate"
...@@ -12,6 +13,7 @@ enum ViewAssociatedKeys { ...@@ -12,6 +13,7 @@ enum ViewAssociatedKeys {
static var viewState = "viewState" static var viewState = "viewState"
static var labelViewState = "labelViewState" static var labelViewState = "labelViewState"
static var imageViewState = "imageViewState" static var imageViewState = "imageViewState"
static var buttonViewState = "buttonViewState"
static var currentSkeletonConfig = "currentSkeletonConfig" static var currentSkeletonConfig = "currentSkeletonConfig"
static var skeletonCornerRadius = "skeletonCornerRadius" static var skeletonCornerRadius = "skeletonCornerRadius"
} }
...@@ -38,13 +40,13 @@ extension UIView { ...@@ -38,13 +40,13 @@ extension UIView {
set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.currentSkeletonConfig) } set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.currentSkeletonConfig) }
} }
var status: Status! { var status: Status {
get { return ao_get(pkey: &ViewAssociatedKeys.status) as? Status ?? .off } get { return ao_get(pkey: &ViewAssociatedKeys.status) as? Status ?? .off }
set { ao_set(newValue ?? .off, pkey: &ViewAssociatedKeys.status) } set { ao_set(newValue, pkey: &ViewAssociatedKeys.status) }
} }
var isSkeletonAnimated: Bool! { var isSkeletonAnimated: Bool {
get { return ao_get(pkey: &ViewAssociatedKeys.isSkeletonAnimated) as? Bool ?? false } get { return ao_get(pkey: &ViewAssociatedKeys.isSkeletonAnimated) as? Bool ?? false }
set { ao_set(newValue ?? false, pkey: &ViewAssociatedKeys.isSkeletonAnimated) } set { ao_set(newValue, pkey: &ViewAssociatedKeys.isSkeletonAnimated) }
} }
} }
...@@ -10,32 +10,38 @@ import UIKit ...@@ -10,32 +10,38 @@ import UIKit
// MARK: Frame // MARK: Frame
extension UIView { extension UIView {
var maxBoundsEstimated: CGRect { var definedMaxBounds: CGRect {
if let parentStackView = (superview as? UIStackView) { if let parentStackView = (superview as? UIStackView) {
var origin: CGPoint = .zero var origin: CGPoint = .zero
switch parentStackView.alignment { switch parentStackView.alignment {
case .trailing: case .trailing:
origin.x = maxWidthEstimated origin.x = definedMaxWidth
default: default:
break break
} }
return CGRect(origin: origin, size: maxSizeEstimated) return CGRect(origin: origin, size: definedMaxSize)
} }
return CGRect(origin: .zero, size: maxSizeEstimated) return CGRect(origin: .zero, size: definedMaxSize)
} }
var maxSizeEstimated: CGSize { var definedMaxSize: CGSize {
return CGSize(width: maxWidthEstimated, height: maxHeightEstimated) CGSize(width: definedMaxWidth, height: definedMaxHeight)
} }
var maxWidthEstimated: CGFloat { var definedMaxWidth: CGFloat {
let constraintsWidth = nonContentSizeLayoutConstraints.filter({ $0.firstAttribute == NSLayoutConstraint.Attribute.width }) max(between: frame.size.width, andContantsOf: widthConstraints)
return max(between: frame.size.width, andContantsOf: constraintsWidth)
} }
var maxHeightEstimated: CGFloat { var definedMaxHeight: CGFloat {
let constraintsHeight = nonContentSizeLayoutConstraints.filter({ $0.firstAttribute == NSLayoutConstraint.Attribute.height }) max(between: frame.size.height, andContantsOf: heightConstraints)
return max(between: frame.size.height, andContantsOf: constraintsHeight) }
var isRTL: Bool {
if #available(iOS 10.0, *), #available(tvOS 10.0, *) {
return effectiveUserInterfaceLayoutDirection == .rightToLeft
} else {
return false
}
} }
private func max(between value: CGFloat, andContantsOf constraints: [NSLayoutConstraint]) -> CGFloat { private func max(between value: CGFloat, andContantsOf constraints: [NSLayoutConstraint]) -> CGFloat {
...@@ -46,8 +52,4 @@ extension UIView { ...@@ -46,8 +52,4 @@ extension UIView {
}) })
return max return max
} }
var nonContentSizeLayoutConstraints: [NSLayoutConstraint] {
return constraints.filter({ "\(type(of: $0))" != "NSContentSizeLayoutConstraint" })
}
} }
...@@ -8,6 +8,12 @@ public extension UIView { ...@@ -8,6 +8,12 @@ public extension UIView {
get { return skeletonable } get { return skeletonable }
set { skeletonable = newValue } set { skeletonable = newValue }
} }
@IBInspectable
var isHiddenWhenSkeletonIsActive: Bool {
get { return hiddenWhenSkeletonIsActive }
set { hiddenWhenSkeletonIsActive = newValue }
}
@IBInspectable @IBInspectable
var skeletonCornerRadius: Float { var skeletonCornerRadius: Float {
...@@ -16,17 +22,21 @@ public extension UIView { ...@@ -16,17 +22,21 @@ public extension UIView {
} }
var isSkeletonActive: Bool { var isSkeletonActive: Bool {
return status == .on || (subviewsSkeletonables.first(where: { $0.isSkeletonActive }) != nil) return status == .on || subviewsSkeletonables.contains(where: { $0.isSkeletonActive })
} }
private var skeletonable: Bool! { private var skeletonable: Bool {
get { return ao_get(pkey: &ViewAssociatedKeys.skeletonable) as? Bool ?? false } get { return ao_get(pkey: &ViewAssociatedKeys.skeletonable) as? Bool ?? false }
set { ao_set(newValue ?? false, pkey: &ViewAssociatedKeys.skeletonable) } set { ao_set(newValue, pkey: &ViewAssociatedKeys.skeletonable) }
}
private var hiddenWhenSkeletonIsActive: Bool {
get { return ao_get(pkey: &ViewAssociatedKeys.hiddenWhenSkeletonIsActive) as? Bool ?? false }
set { ao_set(newValue, pkey: &ViewAssociatedKeys.hiddenWhenSkeletonIsActive) }
} }
private var skeletonableCornerRadius: Float! { private var skeletonableCornerRadius: Float {
get { return ao_get(pkey: &ViewAssociatedKeys.skeletonCornerRadius) as? Float ?? 0.0 } get { return ao_get(pkey: &ViewAssociatedKeys.skeletonCornerRadius) as? Float ?? 0.0 }
set { ao_set(newValue ?? 0.0, pkey: &ViewAssociatedKeys.skeletonCornerRadius) } set { ao_set(newValue, pkey: &ViewAssociatedKeys.skeletonCornerRadius) }
} }
} }
...@@ -12,6 +12,7 @@ enum AssociationPolicy: UInt { ...@@ -12,6 +12,7 @@ enum AssociationPolicy: UInt {
case retainNonatomic = 1 case retainNonatomic = 1
var objc: objc_AssociationPolicy { var objc: objc_AssociationPolicy {
// swiftlint:disable:next force_unwrapping
return objc_AssociationPolicy(rawValue: rawValue)! return objc_AssociationPolicy(rawValue: rawValue)!
} }
} }
......
...@@ -12,15 +12,44 @@ extension UIView { ...@@ -12,15 +12,44 @@ extension UIView {
@objc func prepareViewForSkeleton() { @objc func prepareViewForSkeleton() {
startTransition { [weak self] in startTransition { [weak self] in
self?.backgroundColor = .clear self?.backgroundColor = .clear
self?.isUserInteractionEnabled = false
} }
} }
} }
extension UILabel { extension UILabel {
var desiredHeightBasedOnNumberOfLines: CGFloat {
let lineHeight = multilineTextFont?.lineHeight ?? SkeletonAppearance.default.multilineHeight
let spaceNeededForEachLine = lineHeight * CGFloat(numberOfLines)
let spaceNeededForSpaces = skeletonLineSpacing * CGFloat(numberOfLines - 1)
let padding = paddingInsets.top + paddingInsets.bottom
return spaceNeededForEachLine + spaceNeededForSpaces + padding
}
func updateHeightConstraintsIfNeeded() {
guard numberOfLines > 1 else { return }
let desiredHeight = desiredHeightBasedOnNumberOfLines
if desiredHeight > definedMaxHeight {
backupHeightConstraints = heightConstraints
NSLayoutConstraint.deactivate(heightConstraints)
setHeight(equalToConstant: desiredHeight)
}
}
func restoreBackupHeightConstraints() {
guard !backupHeightConstraints.isEmpty else { return }
NSLayoutConstraint.deactivate(heightConstraints)
NSLayoutConstraint.activate(backupHeightConstraints)
backupHeightConstraints.removeAll()
}
override func prepareViewForSkeleton() { override func prepareViewForSkeleton() {
backgroundColor = .clear backgroundColor = .clear
resignFirstResponder() resignFirstResponder()
startTransition { [weak self] in startTransition { [weak self] in
self?.updateHeightConstraintsIfNeeded()
self?.textColor = .clear self?.textColor = .clear
} }
} }
...@@ -44,3 +73,12 @@ extension UIImageView { ...@@ -44,3 +73,12 @@ extension UIImageView {
} }
} }
} }
extension UIButton {
override func prepareViewForSkeleton() {
backgroundColor = .clear
startTransition { [weak self] in
self?.setTitle(nil, for: .normal)
}
}
}
...@@ -9,7 +9,7 @@ protocol IterableElement {} ...@@ -9,7 +9,7 @@ protocol IterableElement {}
extension UIView: IterableElement {} extension UIView: IterableElement {}
extension CALayer: IterableElement {} extension CALayer: IterableElement {}
//MARK: Recursive // MARK: Recursive
protocol Recursive { protocol Recursive {
associatedtype Element: IterableElement associatedtype Element: IterableElement
func recursiveSearch(leafBlock: VoidBlock, recursiveBlock: RecursiveBlock<Element>) func recursiveSearch(leafBlock: VoidBlock, recursiveBlock: RecursiveBlock<Element>)
...@@ -17,12 +17,10 @@ protocol Recursive { ...@@ -17,12 +17,10 @@ protocol Recursive {
extension Array: Recursive where Element: IterableElement { extension Array: Recursive where Element: IterableElement {
func recursiveSearch(leafBlock: VoidBlock, recursiveBlock: RecursiveBlock<Element>) { func recursiveSearch(leafBlock: VoidBlock, recursiveBlock: RecursiveBlock<Element>) {
guard count > 0 else { guard !isEmpty else {
leafBlock() leafBlock()
return return
} }
forEach { recursiveBlock($0) } forEach { recursiveBlock($0) }
} }
} }
...@@ -5,7 +5,7 @@ import Foundation ...@@ -5,7 +5,7 @@ import Foundation
extension DispatchQueue { extension DispatchQueue {
private static var _onceTracker = [String]() private static var _onceTracker = [String]()
class func once(token: String, block:()->Void) { class func once(token: String, block: () -> Void) {
objc_sync_enter(self); defer { objc_sync_exit(self) } objc_sync_enter(self); defer { objc_sync_exit(self) }
guard !_onceTracker.contains(token) else { return } guard !_onceTracker.contains(token) else { return }
...@@ -19,7 +19,7 @@ func swizzle(selector originalSelector: Selector, with swizzledSelector: Selecto ...@@ -19,7 +19,7 @@ func swizzle(selector originalSelector: Selector, with swizzledSelector: Selecto
let swizzledMethod = class_getInstanceMethod(usingClass, swizzledSelector) let swizzledMethod = class_getInstanceMethod(usingClass, swizzledSelector)
else { return } else { return }
if (class_addMethod(inClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))) { if class_addMethod(inClass, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)) {
class_replaceMethod(inClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)) class_replaceMethod(inClass, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
} else { } else {
method_exchangeImplementations(originalMethod, swizzledMethod) method_exchangeImplementations(originalMethod, swizzledMethod)
......
...@@ -7,6 +7,7 @@ enum MultilineAssociatedKeys { ...@@ -7,6 +7,7 @@ enum MultilineAssociatedKeys {
static var multilineCornerRadius = "multilineCornerRadius" static var multilineCornerRadius = "multilineCornerRadius"
static var multilineSpacing = "multilineSpacing" static var multilineSpacing = "multilineSpacing"
static var paddingInsets = "paddingInsets" static var paddingInsets = "paddingInsets"
static var backupHeightConstraints = "backupHeightConstraints"
} }
protocol ContainsMultilineText { protocol ContainsMultilineText {
...@@ -17,7 +18,3 @@ protocol ContainsMultilineText { ...@@ -17,7 +18,3 @@ protocol ContainsMultilineText {
var multilineSpacing: CGFloat { get } var multilineSpacing: CGFloat { get }
var paddingInsets: UIEdgeInsets { get } var paddingInsets: UIEdgeInsets { get }
} }
extension ContainsMultilineText {
var numLines: Int { return 0 }
}
...@@ -8,17 +8,19 @@ public extension UILabel { ...@@ -8,17 +8,19 @@ public extension UILabel {
get { return lastLineFillingPercent } get { return lastLineFillingPercent }
set { lastLineFillingPercent = min(newValue, 100) } set { lastLineFillingPercent = min(newValue, 100) }
} }
@IBInspectable @IBInspectable
var linesCornerRadius: Int { var linesCornerRadius: Int {
get { return multilineCornerRadius } get { return multilineCornerRadius }
set { multilineCornerRadius = min(newValue, 10) } set { multilineCornerRadius = min(newValue, 10) }
} }
@IBInspectable @IBInspectable
var skeletonLineSpacing: CGFloat { var skeletonLineSpacing: CGFloat {
get { return multilineSpacing } get { return multilineSpacing }
set { multilineSpacing = min(newValue, 10) } set { multilineSpacing = min(newValue, 10) }
} }
@IBInspectable
var skeletonPaddingInsets: UIEdgeInsets { var skeletonPaddingInsets: UIEdgeInsets {
get { return paddingInsets } get { return paddingInsets }
set { paddingInsets = newValue } set { paddingInsets = newValue }
...@@ -53,4 +55,9 @@ extension UILabel: ContainsMultilineText { ...@@ -53,4 +55,9 @@ extension UILabel: ContainsMultilineText {
get { return ao_get(pkey: &MultilineAssociatedKeys.paddingInsets) as? UIEdgeInsets ?? .zero } get { return ao_get(pkey: &MultilineAssociatedKeys.paddingInsets) as? UIEdgeInsets ?? .zero }
set { ao_set(newValue, pkey: &MultilineAssociatedKeys.paddingInsets) } set { ao_set(newValue, pkey: &MultilineAssociatedKeys.paddingInsets) }
} }
var backupHeightConstraints: [NSLayoutConstraint] {
get { return ao_get(pkey: &MultilineAssociatedKeys.backupHeightConstraints) as? [NSLayoutConstraint] ?? [] }
set { ao_set(newValue, pkey: &MultilineAssociatedKeys.backupHeightConstraints) }
}
} }
...@@ -21,7 +21,6 @@ public extension UITextView { ...@@ -21,7 +21,6 @@ public extension UITextView {
set { multilineSpacing = min(newValue, 10) } set { multilineSpacing = min(newValue, 10) }
} }
@IBInspectable
var skeletonPaddingInsets: UIEdgeInsets { var skeletonPaddingInsets: UIEdgeInsets {
get { return paddingInsets } get { return paddingInsets }
set { paddingInsets = newValue } set { paddingInsets = newValue }
...@@ -30,8 +29,12 @@ public extension UITextView { ...@@ -30,8 +29,12 @@ public extension UITextView {
extension UITextView: ContainsMultilineText { extension UITextView: ContainsMultilineText {
var multilineTextFont: UIFont? { var multilineTextFont: UIFont? {
return font font
} }
var numLines: Int {
-1
}
var lastLineFillingPercent: Int { var lastLineFillingPercent: Int {
get { get {
......
...@@ -24,20 +24,21 @@ extension UIView: Recoverable { ...@@ -24,20 +24,21 @@ extension UIView: Recoverable {
} }
@objc func recoverViewState(forced: Bool) { @objc func recoverViewState(forced: Bool) {
guard let safeViewState = viewState else { return } guard let storedViewState = viewState else { return }
startTransition { [weak self] in startTransition { [weak self] in
self?.layer.cornerRadius = safeViewState.cornerRadius self?.layer.cornerRadius = storedViewState.cornerRadius
self?.layer.masksToBounds = safeViewState.clipToBounds self?.layer.masksToBounds = storedViewState.clipToBounds
self?.isUserInteractionEnabled = storedViewState.isUserInteractionsEnabled
if safeViewState.backgroundColor != self?.backgroundColor || forced { if self?.backgroundColor == .clear || forced {
self?.backgroundColor = safeViewState.backgroundColor self?.backgroundColor = storedViewState.backgroundColor
} }
} }
} }
} }
extension UILabel{ extension UILabel {
var labelState: RecoverableTextViewState? { var labelState: RecoverableTextViewState? {
get { return ao_get(pkey: &ViewAssociatedKeys.labelViewState) as? RecoverableTextViewState } get { return ao_get(pkey: &ViewAssociatedKeys.labelViewState) as? RecoverableTextViewState }
set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.labelViewState) } set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.labelViewState) }
...@@ -51,14 +52,18 @@ extension UILabel{ ...@@ -51,14 +52,18 @@ extension UILabel{
override func recoverViewState(forced: Bool) { override func recoverViewState(forced: Bool) {
super.recoverViewState(forced: forced) super.recoverViewState(forced: forced)
startTransition { [weak self] in startTransition { [weak self] in
self?.textColor = self?.labelState?.textColor guard let storedLabelState = self?.labelState else { return }
self?.text = self?.labelState?.text
self?.isUserInteractionEnabled = self?.labelState?.isUserInteractionsEnabled ?? false self?.restoreBackupHeightConstraints()
if self?.textColor == .clear || forced {
self?.textColor = storedLabelState.textColor
}
} }
} }
} }
extension UITextView{ extension UITextView {
var textState: RecoverableTextViewState? { var textState: RecoverableTextViewState? {
get { return ao_get(pkey: &ViewAssociatedKeys.labelViewState) as? RecoverableTextViewState } get { return ao_get(pkey: &ViewAssociatedKeys.labelViewState) as? RecoverableTextViewState }
set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.labelViewState) } set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.labelViewState) }
...@@ -72,9 +77,11 @@ extension UITextView{ ...@@ -72,9 +77,11 @@ extension UITextView{
override func recoverViewState(forced: Bool) { override func recoverViewState(forced: Bool) {
super.recoverViewState(forced: forced) super.recoverViewState(forced: forced)
startTransition { [weak self] in startTransition { [weak self] in
self?.textColor = self?.textState?.textColor guard let storedLabelState = self?.textState else { return }
self?.text = self?.textState?.text
self?.isUserInteractionEnabled = self?.textState?.isUserInteractionsEnabled ?? false if self?.textColor == .clear || forced {
self?.textColor = storedLabelState.textColor
}
} }
} }
} }
...@@ -97,3 +104,24 @@ extension UIImageView { ...@@ -97,3 +104,24 @@ extension UIImageView {
} }
} }
} }
extension UIButton {
var buttonState: RecoverableButtonViewState? {
get { return ao_get(pkey: &ViewAssociatedKeys.buttonViewState) as? RecoverableButtonViewState }
set { ao_setOptional(newValue, pkey: &ViewAssociatedKeys.buttonViewState) }
}
override func saveViewState() {
super.saveViewState()
buttonState = RecoverableButtonViewState(view: self)
}
override func recoverViewState(forced: Bool) {
super.recoverViewState(forced: forced)
startTransition { [weak self] in
if self?.title(for: .normal) == nil {
self?.setTitle(self?.buttonState?.title, for: .normal)
}
}
}
}
...@@ -12,29 +12,25 @@ struct RecoverableViewState { ...@@ -12,29 +12,25 @@ struct RecoverableViewState {
var backgroundColor: UIColor? var backgroundColor: UIColor?
var cornerRadius: CGFloat var cornerRadius: CGFloat
var clipToBounds: Bool var clipToBounds: Bool
var isUserInteractionsEnabled: Bool
init(view: UIView) { init(view: UIView) {
self.backgroundColor = view.backgroundColor self.backgroundColor = view.backgroundColor
self.clipToBounds = view.layer.masksToBounds self.clipToBounds = view.layer.masksToBounds
self.cornerRadius = view.layer.cornerRadius self.cornerRadius = view.layer.cornerRadius
self.isUserInteractionsEnabled = view.isUserInteractionEnabled
} }
} }
struct RecoverableTextViewState { struct RecoverableTextViewState {
var text: String?
var textColor: UIColor? var textColor: UIColor?
var isUserInteractionsEnabled: Bool
init(view: UILabel) { init(view: UILabel) {
self.textColor = view.textColor self.textColor = view.textColor
self.text = view.text
self.isUserInteractionsEnabled = view.isUserInteractionEnabled
} }
init(view: UITextView) { init(view: UITextView) {
self.textColor = view.textColor self.textColor = view.textColor
self.text = view.text
self.isUserInteractionsEnabled = view.isUserInteractionEnabled
} }
} }
...@@ -45,3 +41,11 @@ struct RecoverableImageViewState { ...@@ -45,3 +41,11 @@ struct RecoverableImageViewState {
self.image = view.image self.image = view.image
} }
} }
struct RecoverableButtonViewState {
var title: String?
init(view: UIButton) {
self.title = view.titleLabel?.text
}
}
...@@ -18,42 +18,42 @@ public enum GradientDirection { ...@@ -18,42 +18,42 @@ public enum GradientDirection {
case topLeftBottomRight case topLeftBottomRight
case bottomRightTopLeft case bottomRightTopLeft
public func slidingAnimation(duration: CFTimeInterval = 1.5) -> SkeletonLayerAnimation { public func slidingAnimation(duration: CFTimeInterval = 1.5, autoreverses: Bool = false) -> SkeletonLayerAnimation {
return SkeletonAnimationBuilder().makeSlidingAnimation(withDirection: self, duration: duration) return SkeletonAnimationBuilder().makeSlidingAnimation(withDirection: self, duration: duration, autoreverses: autoreverses)
} }
// codebeat:disable[ABC] // codebeat:disable[ABC]
var startPoint: GradientAnimationPoint { var startPoint: GradientAnimationPoint {
switch self { switch self {
case .leftRight: case .leftRight:
return (from: CGPoint(x:-1, y:0.5), to: CGPoint(x:1, y:0.5)) return (from: CGPoint(x: -1, y: 0.5), to: CGPoint(x: 1, y: 0.5))
case .rightLeft: case .rightLeft:
return (from: CGPoint(x:1, y:0.5), to: CGPoint(x:-1, y:0.5)) return (from: CGPoint(x: 1, y: 0.5), to: CGPoint(x: -1, y: 0.5))
case .topBottom: case .topBottom:
return (from: CGPoint(x:0.5, y:-1), to: CGPoint(x:0.5, y:1)) return (from: CGPoint(x: 0.5, y: -1), to: CGPoint(x: 0.5, y: 1))
case .bottomTop: case .bottomTop:
return (from: CGPoint(x:0.5, y:1), to: CGPoint(x:0.5, y:-1)) return (from: CGPoint(x: 0.5, y: 1), to: CGPoint(x: 0.5, y: -1))
case .topLeftBottomRight: case .topLeftBottomRight:
return (from: CGPoint(x:-1, y:-1), to: CGPoint(x:1, y:1)) return (from: CGPoint(x: -1, y: -1), to: CGPoint(x: 1, y: 1))
case .bottomRightTopLeft: case .bottomRightTopLeft:
return (from: CGPoint(x:1, y:1), to: CGPoint(x:-1, y:-1)) return (from: CGPoint(x: 1, y: 1), to: CGPoint(x: -1, y: -1))
} }
} }
var endPoint: GradientAnimationPoint { var endPoint: GradientAnimationPoint {
switch self { switch self {
case .leftRight: case .leftRight:
return (from: CGPoint(x:0, y:0.5), to: CGPoint(x:2, y:0.5)) return (from: CGPoint(x: 0, y: 0.5), to: CGPoint(x: 2, y: 0.5))
case .rightLeft: case .rightLeft:
return ( from: CGPoint(x:2, y:0.5), to: CGPoint(x:0, y:0.5)) return ( from: CGPoint(x: 2, y: 0.5), to: CGPoint(x: 0, y: 0.5))
case .topBottom: case .topBottom:
return ( from: CGPoint(x:0.5, y:0), to: CGPoint(x:0.5, y:2)) return ( from: CGPoint(x: 0.5, y: 0), to: CGPoint(x: 0.5, y: 2))
case .bottomTop: case .bottomTop:
return ( from: CGPoint(x:0.5, y:2), to: CGPoint(x:0.5, y:0)) return ( from: CGPoint(x: 0.5, y: 2), to: CGPoint(x: 0.5, y: 0))
case .topLeftBottomRight: case .topLeftBottomRight:
return ( from: CGPoint(x:0, y:0), to: CGPoint(x:2, y:2)) return ( from: CGPoint(x: 0, y: 0), to: CGPoint(x: 2, y: 2))
case .bottomRightTopLeft: case .bottomRightTopLeft:
return ( from: CGPoint(x:2, y:2), to: CGPoint(x:0, y:0)) return ( from: CGPoint(x: 2, y: 2), to: CGPoint(x: 0, y: 0))
} }
} }
// codebeat:enable[ABC] // codebeat:enable[ABC]
...@@ -62,9 +62,8 @@ public enum GradientDirection { ...@@ -62,9 +62,8 @@ public enum GradientDirection {
public class SkeletonAnimationBuilder { public class SkeletonAnimationBuilder {
public init() { } public init() { }
public func makeSlidingAnimation(withDirection direction: GradientDirection, duration: CFTimeInterval = 1.5) -> SkeletonLayerAnimation { public func makeSlidingAnimation(withDirection direction: GradientDirection, duration: CFTimeInterval = 1.5, autoreverses: Bool = false) -> SkeletonLayerAnimation {
return { layer in return { layer in
let startPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint)) let startPointAnim = CABasicAnimation(keyPath: #keyPath(CAGradientLayer.startPoint))
startPointAnim.fromValue = direction.startPoint.from startPointAnim.fromValue = direction.startPoint.from
startPointAnim.toValue = direction.startPoint.to startPointAnim.toValue = direction.startPoint.to
...@@ -78,6 +77,7 @@ public class SkeletonAnimationBuilder { ...@@ -78,6 +77,7 @@ public class SkeletonAnimationBuilder {
animGroup.duration = duration animGroup.duration = duration
animGroup.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn) animGroup.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeIn)
animGroup.repeatCount = .infinity animGroup.repeatCount = .infinity
animGroup.autoreverses = autoreverses
animGroup.isRemovedOnCompletion = false animGroup.isRemovedOnCompletion = false
return animGroup return animGroup
......
...@@ -22,14 +22,12 @@ struct SkeletonConfig { ...@@ -22,14 +22,12 @@ struct SkeletonConfig {
/// Transition style /// Transition style
var transition: SkeletonTransitionStyle var transition: SkeletonTransitionStyle
init( init(type: SkeletonType,
type: SkeletonType, colors: [UIColor],
colors: [UIColor], gradientDirection: GradientDirection? = nil,
gradientDirection: GradientDirection? = nil, animated: Bool = false,
animated: Bool = false, animation: SkeletonLayerAnimation? = nil,
animation: SkeletonLayerAnimation? = nil, transition: SkeletonTransitionStyle = .crossDissolve(0.25)) {
transition: SkeletonTransitionStyle = .crossDissolve(0.25)
) {
self.type = type self.type = type
self.colors = colors self.colors = colors
self.gradientDirection = gradientDirection self.gradientDirection = gradientDirection
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import UIKit import UIKit
protocol SkeletonFlowDelegate { protocol SkeletonFlowDelegate: AnyObject {
func willBeginShowingSkeletons(rootView: UIView) func willBeginShowingSkeletons(rootView: UIView)
func didShowSkeletons(rootView: UIView) func didShowSkeletons(rootView: UIView)
func willBeginUpdatingSkeletons(rootView: UIView) func willBeginUpdatingSkeletons(rootView: UIView)
......
...@@ -23,12 +23,12 @@ public enum SkeletonType { ...@@ -23,12 +23,12 @@ public enum SkeletonType {
} }
} }
var layerAnimation: SkeletonLayerAnimation { func defaultLayerAnimation(isRTL: Bool) -> SkeletonLayerAnimation {
switch self { switch self {
case .solid: case .solid:
return { $0.pulse } return { $0.pulse }
case .gradient: case .gradient:
return { $0.sliding } return { SkeletonAnimationBuilder().makeSlidingAnimation(withDirection: isRTL ? .rightLeft : .leftRight) }()
} }
} }
} }
...@@ -49,7 +49,7 @@ struct SkeletonLayer { ...@@ -49,7 +49,7 @@ struct SkeletonLayer {
self.holder = holder self.holder = holder
self.maskLayer = type.layer self.maskLayer = type.layer
self.maskLayer.anchorPoint = .zero self.maskLayer.anchorPoint = .zero
self.maskLayer.bounds = holder.maxBoundsEstimated self.maskLayer.bounds = holder.definedMaxBounds
self.maskLayer.cornerRadius = CGFloat(holder.skeletonCornerRadius) self.maskLayer.cornerRadius = CGFloat(holder.skeletonCornerRadius)
addTextLinesIfNeeded() addTextLinesIfNeeded()
self.maskLayer.tint(withColors: colors) self.maskLayer.tint(withColors: colors)
...@@ -61,7 +61,7 @@ struct SkeletonLayer { ...@@ -61,7 +61,7 @@ struct SkeletonLayer {
} }
func layoutIfNeeded() { func layoutIfNeeded() {
if let bounds = holder?.maxBoundsEstimated { if let bounds = holder?.definedMaxBounds {
maskLayer.bounds = bounds maskLayer.bounds = bounds
} }
updateLinesIfNeeded() updateLinesIfNeeded()
...@@ -83,34 +83,37 @@ struct SkeletonLayer { ...@@ -83,34 +83,37 @@ struct SkeletonLayer {
/// If there is more than one line, or custom preferences have been set for a single line, draw custom layers /// If there is more than one line, or custom preferences have been set for a single line, draw custom layers
func addTextLinesIfNeeded() { func addTextLinesIfNeeded() {
guard let textView = holderAsTextView else { return } guard let textView = holderAsTextView else { return }
let lineHeight = textView.multilineTextFont?.lineHeight ?? SkeletonAppearance.default.multilineHeight
let config = SkeletonMultilinesLayerConfig(lines: textView.numLines, let config = SkeletonMultilinesLayerConfig(lines: textView.numLines,
lineHeight: textView.multilineTextFont?.lineHeight, lineHeight: lineHeight,
type: type, type: type,
lastLineFillPercent: textView.lastLineFillingPercent, lastLineFillPercent: textView.lastLineFillingPercent,
multilineCornerRadius: textView.multilineCornerRadius, multilineCornerRadius: textView.multilineCornerRadius,
multilineSpacing: textView.multilineSpacing, multilineSpacing: textView.multilineSpacing,
paddingInsets: textView.paddingInsets) paddingInsets: textView.paddingInsets,
isRTL: holder?.isRTL ?? false)
maskLayer.addMultilinesLayers(for: config) maskLayer.addMultilinesLayers(for: config)
} }
func updateLinesIfNeeded() { func updateLinesIfNeeded() {
guard let textView = holderAsTextView else { return } guard let textView = holderAsTextView else { return }
let lineHeight = textView.multilineTextFont?.lineHeight ?? SkeletonAppearance.default.multilineHeight
let config = SkeletonMultilinesLayerConfig(lines: textView.numLines, let config = SkeletonMultilinesLayerConfig(lines: textView.numLines,
lineHeight: textView.multilineTextFont?.lineHeight, lineHeight: lineHeight,
type: type, type: type,
lastLineFillPercent: textView.lastLineFillingPercent, lastLineFillPercent: textView.lastLineFillingPercent,
multilineCornerRadius: textView.multilineCornerRadius, multilineCornerRadius: textView.multilineCornerRadius,
multilineSpacing: textView.multilineSpacing, multilineSpacing: textView.multilineSpacing,
paddingInsets: textView.paddingInsets) paddingInsets: textView.paddingInsets,
isRTL: holder?.isRTL ?? false)
maskLayer.updateMultilinesLayers(for: config) maskLayer.updateMultilinesLayers(for: config)
} }
var holderAsTextView: ContainsMultilineText? { var holderAsTextView: ContainsMultilineText? {
guard let textView = holder as? ContainsMultilineText, guard let textView = holder as? ContainsMultilineText,
(textView.numLines == 0 || textView.numLines > 1 || textView.numLines == 1 && !SkeletonAppearance.default.renderSingleLineAsView) else { (textView.numLines == -1 || textView.numLines == 0 || textView.numLines > 1 || textView.numLines == 1 && !SkeletonAppearance.default.renderSingleLineAsView) else {
return nil return nil
} }
return textView return textView
...@@ -119,7 +122,7 @@ struct SkeletonLayer { ...@@ -119,7 +122,7 @@ struct SkeletonLayer {
extension SkeletonLayer { extension SkeletonLayer {
func start(_ anim: SkeletonLayerAnimation? = nil, completion: (() -> Void)? = nil) { func start(_ anim: SkeletonLayerAnimation? = nil, completion: (() -> Void)? = nil) {
let animation = anim ?? type.layerAnimation let animation = anim ?? type.defaultLayerAnimation(isRTL: holder?.isRTL ?? false)
contentLayer.playAnimation(animation, key: "skeletonAnimation", completion: completion) contentLayer.playAnimation(animation, key: "skeletonAnimation", completion: completion)
} }
......
...@@ -94,6 +94,7 @@ public extension UIView { ...@@ -94,6 +94,7 @@ public extension UIView {
extension UIView { extension UIView {
@objc func skeletonLayoutSubviews() { @objc func skeletonLayoutSubviews() {
guard Thread.isMainThread else { return }
skeletonLayoutSubviews() skeletonLayoutSubviews()
guard isSkeletonActive else { return } guard isSkeletonActive else { return }
layoutSkeletonIfNeeded() layoutSkeletonIfNeeded()
...@@ -113,6 +114,9 @@ extension UIView { ...@@ -113,6 +114,9 @@ extension UIView {
} }
private func recursiveShowSkeleton(skeletonConfig config: SkeletonConfig, root: UIView? = nil) { private func recursiveShowSkeleton(skeletonConfig config: SkeletonConfig, root: UIView? = nil) {
if isHiddenWhenSkeletonIsActive {
isHidden = true
}
guard isSkeletonable && !isSkeletonActive else { return } guard isSkeletonable && !isSkeletonActive else { return }
currentSkeletonConfig = config currentSkeletonConfig = config
swizzleLayoutSubviews() swizzleLayoutSubviews()
...@@ -120,7 +124,7 @@ extension UIView { ...@@ -120,7 +124,7 @@ extension UIView {
addDummyDataSourceIfNeeded() addDummyDataSourceIfNeeded()
subviewsSkeletonables.recursiveSearch(leafBlock: { subviewsSkeletonables.recursiveSearch(leafBlock: {
showSkeletonIfNotActive(skeletonConfig: config) showSkeletonIfNotActive(skeletonConfig: config)
}){ subview in }) { subview in
subview.recursiveShowSkeleton(skeletonConfig: config) subview.recursiveShowSkeleton(skeletonConfig: config)
} }
...@@ -148,7 +152,8 @@ extension UIView { ...@@ -148,7 +152,8 @@ extension UIView {
currentSkeletonConfig = config currentSkeletonConfig = config
updateDummyDataSourceIfNeeded() updateDummyDataSourceIfNeeded()
subviewsSkeletonables.recursiveSearch(leafBlock: { subviewsSkeletonables.recursiveSearch(leafBlock: {
if skeletonLayer?.type != config.type { if let skeletonLayer = skeletonLayer,
skeletonLayer.type != config.type {
removeSkeletonLayer() removeSkeletonLayer()
addSkeletonLayer(skeletonConfig: config) addSkeletonLayer(skeletonConfig: config)
} else { } else {
...@@ -181,6 +186,9 @@ extension UIView { ...@@ -181,6 +186,9 @@ extension UIView {
private func recursiveHideSkeleton(reloadDataAfter reload: Bool, transition: SkeletonTransitionStyle, root: UIView? = nil) { private func recursiveHideSkeleton(reloadDataAfter reload: Bool, transition: SkeletonTransitionStyle, root: UIView? = nil) {
guard isSkeletonActive else { return } guard isSkeletonActive else { return }
if isHiddenWhenSkeletonIsActive {
isHidden = false
}
currentSkeletonConfig?.transition = transition currentSkeletonConfig?.transition = transition
isUserInteractionEnabled = true isUserInteractionEnabled = true
removeDummyDataSourceIfNeeded(reloadAfter: reload) removeDummyDataSourceIfNeeded(reloadAfter: reload)
......
...@@ -8,7 +8,6 @@ extension CALayer { ...@@ -8,7 +8,6 @@ extension CALayer {
switch transition { switch transition {
case .none: case .none:
completion?() completion?()
break
case .crossDissolve(let duration): case .crossDissolve(let duration):
layer.contentLayer.setOpacity(from: 0, to: 1, duration: duration, completion: completion) layer.contentLayer.setOpacity(from: 0, to: 1, duration: duration, completion: completion)
} }
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
<key>CFBundlePackageType</key> <key>CFBundlePackageType</key>
<string>FMWK</string> <string>FMWK</string>
<key>CFBundleShortVersionString</key> <key>CFBundleShortVersionString</key>
<string>1.8.7</string> <string>1.11.0</string>
<key>CFBundleSignature</key> <key>CFBundleSignature</key>
<string>????</string> <string>????</string>
<key>CFBundleVersion</key> <key>CFBundleVersion</key>
......
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