diff --git a/Cartfile.resolved b/Cartfile.resolved index 1fa2ea8..ba6acb4 100644 --- a/Cartfile.resolved +++ b/Cartfile.resolved @@ -1 +1 @@ -git "git@github.com:CodeEagle/KVOBlock.git" "0.1.3" +git "git@github.com:CodeEagle/KVOBlock.git" "0.1.6" diff --git a/Carthage/Checkouts/KVOBlock/Carthage/Build b/Carthage/Checkouts/KVOBlock/Carthage/Build deleted file mode 120000 index 76f9ba2..0000000 --- a/Carthage/Checkouts/KVOBlock/Carthage/Build +++ /dev/null @@ -1 +0,0 @@ -../../../../Carthage/Build \ No newline at end of file diff --git a/Carthage/Checkouts/KVOBlock/KVOBlock/Demo/ViewController.swift b/Carthage/Checkouts/KVOBlock/KVOBlock/Demo/ViewController.swift index 33448cb..69a6cb8 100644 --- a/Carthage/Checkouts/KVOBlock/KVOBlock/Demo/ViewController.swift +++ b/Carthage/Checkouts/KVOBlock/KVOBlock/Demo/ViewController.swift @@ -11,18 +11,18 @@ import KVOBlock class ViewController: UIViewController { - override func viewDidLoad() { - super.viewDidLoad() - view.observeKeyPath("frame") { (target, old, new) in - - } - // Do any additional setup after loading the view, typically from a nib. - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } + override func viewDidLoad() { + super.viewDidLoad() + view.observeKeyPath("frame") { _, _, _ in + } + view.removeObserver(for: "frame") + view.observeKeyPath("frame") { _, _, _ in + } + // Do any additional setup after loading the view, typically from a nib. + } + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } } - diff --git a/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/project.pbxproj b/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/project.pbxproj index 7a7a464..a9b5896 100644 --- a/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/project.pbxproj +++ b/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/project.pbxproj @@ -159,7 +159,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0730; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = SelfStudio; TargetAttributes = { 1625FC551D002A3000B7808B = { @@ -260,13 +260,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -308,13 +316,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -334,6 +350,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -344,34 +361,52 @@ 1625FC5F1D002A3000B7808B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + BITCODE_GENERATION_MODE = marker; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + "ENABLE_BITCODE[sdk=macosx*]" = NO; INFOPLIST_FILE = KVOBlock/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = com.SelfStudio.KVOBlock; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvos watchos appletvsimulator watchsimulator"; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Debug; }; 1625FC601D002A3000B7808B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + BITCODE_GENERATION_MODE = bitcode; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + "ENABLE_BITCODE[sdk=macosx*]" = NO; INFOPLIST_FILE = KVOBlock/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = com.SelfStudio.KVOBlock; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx appletvos watchos appletvsimulator watchsimulator"; + TARGETED_DEVICE_FAMILY = "1,2,3,4"; + TVOS_DEPLOYMENT_TARGET = 9.0; + WATCHOS_DEPLOYMENT_TARGET = 2.0; }; name = Release; }; diff --git a/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/xcshareddata/xcschemes/KVOBlock.xcscheme b/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/xcshareddata/xcschemes/KVOBlock.xcscheme index 11f89f0..e779e61 100644 --- a/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/xcshareddata/xcschemes/KVOBlock.xcscheme +++ b/Carthage/Checkouts/KVOBlock/KVOBlock/KVOBlock.xcodeproj/xcshareddata/xcschemes/KVOBlock.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/Carthage/Checkouts/KVOBlock/Source/KVOBlock.m b/Carthage/Checkouts/KVOBlock/Source/KVOBlock.m index 6f9f6d3..8b2ed7a 100755 --- a/Carthage/Checkouts/KVOBlock/Source/KVOBlock.m +++ b/Carthage/Checkouts/KVOBlock/Source/KVOBlock.m @@ -30,8 +30,7 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } } -- (void)dealloc -{ +- (void)dealloc { if (self.beObserver) { [self.beObserver removeObserver:self forKeyPath:self.keyPath]; } @@ -49,7 +48,7 @@ - (void)observeKeyPath:(NSString *)keyPath withBlock:(KVOBlockChange)observation observer.beObserver = self; observer.observationBlock = observationBlock; [self addObserver:observer forKeyPath:keyPath options:(NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld) context:nil]; - NSDictionary * dict = @{@"keyPath" : observer}; + NSDictionary * dict = @{keyPath : observer}; [self.associateObserverBlockArray addObject:dict]; } diff --git a/Default-568h@2x.png b/Default-568h@2x.png new file mode 100644 index 0000000..0891b7a Binary files /dev/null and b/Default-568h@2x.png differ diff --git a/ScrollviewBatchFetchingable macOS/Info.plist b/ScrollviewBatchFetchingable macOS/Info.plist new file mode 100644 index 0000000..a32c8ce --- /dev/null +++ b/ScrollviewBatchFetchingable macOS/Info.plist @@ -0,0 +1,26 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + FMWK + CFBundleShortVersionString + 1.0 + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + NSHumanReadableCopyright + Copyright © 2017年 CocoaPods. All rights reserved. + NSPrincipalClass + + + diff --git a/ScrollviewBatchFetchingable macOS/ScrollviewBatchFetchingable_macOS.h b/ScrollviewBatchFetchingable macOS/ScrollviewBatchFetchingable_macOS.h new file mode 100644 index 0000000..22f8af4 --- /dev/null +++ b/ScrollviewBatchFetchingable macOS/ScrollviewBatchFetchingable_macOS.h @@ -0,0 +1,19 @@ +// +// ScrollviewBatchFetchingable_macOS.h +// ScrollviewBatchFetchingable macOS +// +// Created by lincolnlaw on 2017/7/18. +// Copyright © 2017年 CocoaPods. All rights reserved. +// + +#import + +//! Project version number for ScrollviewBatchFetchingable_macOS. +FOUNDATION_EXPORT double ScrollviewBatchFetchingable_macOSVersionNumber; + +//! Project version string for ScrollviewBatchFetchingable_macOS. +FOUNDATION_EXPORT const unsigned char ScrollviewBatchFetchingable_macOSVersionString[]; + +// In this header, you should import all the public headers of your framework using statements like #import + + diff --git a/ScrollviewBatchFetchingable.xcodeproj/project.pbxproj b/ScrollviewBatchFetchingable.xcodeproj/project.pbxproj index c2bf169..f054675 100644 --- a/ScrollviewBatchFetchingable.xcodeproj/project.pbxproj +++ b/ScrollviewBatchFetchingable.xcodeproj/project.pbxproj @@ -7,15 +7,18 @@ objects = { /* Begin PBXBuildFile section */ + 10CFED461F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.h in Headers */ = {isa = PBXBuildFile; fileRef = 10CFED441F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 10CFED4A1F1E105100CBCA32 /* ScrollView+SSBatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166F12E21D0031D400778775 /* ScrollView+SSBatchContext.swift */; }; 16061A941D002D8200055A4B /* ScrollviewBatchFetchingable.h in Headers */ = {isa = PBXBuildFile; fileRef = 16061A931D002D8200055A4B /* ScrollviewBatchFetchingable.h */; settings = {ATTRIBUTES = (Public, ); }; }; 16061A981D002D8200055A4B /* ScrollviewBatchFetchingable.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16061A911D002D8200055A4B /* ScrollviewBatchFetchingable.framework */; }; 16061A991D002D8200055A4B /* ScrollviewBatchFetchingable.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 16061A911D002D8200055A4B /* ScrollviewBatchFetchingable.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; - 16061AA11D002DEC00055A4B /* KVOBlock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 16061AA01D002DEC00055A4B /* KVOBlock.framework */; }; - 166F12E31D0031D400778775 /* UIScrollView+SSBatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166F12E21D0031D400778775 /* UIScrollView+SSBatchContext.swift */; }; + 166F12E31D0031D400778775 /* ScrollView+SSBatchContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 166F12E21D0031D400778775 /* ScrollView+SSBatchContext.swift */; }; 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; + AD52A9D7E6DD4C989BB09D51 /* KVOBlock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E144D41862144B591B0C49A /* KVOBlock.framework */; }; + E7588299A4EA4B6789848CC9 /* KVOBlock.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 2E144D41862144B591B0C49A /* KVOBlock.framework */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -43,12 +46,16 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ + 10CFED421F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ScrollviewBatchFetchingable_macOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 10CFED441F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScrollviewBatchFetchingable_macOS.h; sourceTree = ""; }; + 10CFED451F1E102A00CBCA32 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 10FD67D41F1B0B140086C6B4 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 16061A911D002D8200055A4B /* ScrollviewBatchFetchingable.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = ScrollviewBatchFetchingable.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 16061A931D002D8200055A4B /* ScrollviewBatchFetchingable.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ScrollviewBatchFetchingable.h; sourceTree = ""; }; 16061A951D002D8200055A4B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 16061AA01D002DEC00055A4B /* KVOBlock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KVOBlock.framework; path = Carthage/Build/iOS/KVOBlock.framework; sourceTree = ""; }; - 166F12E21D0031D400778775 /* UIScrollView+SSBatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIScrollView+SSBatchContext.swift"; path = "Source/UIScrollView+SSBatchContext.swift"; sourceTree = SOURCE_ROOT; }; + 166F12E21D0031D400778775 /* ScrollView+SSBatchContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "ScrollView+SSBatchContext.swift"; path = "Source/ScrollView+SSBatchContext.swift"; sourceTree = SOURCE_ROOT; }; 16DF19DE1DC3080100370525 /* Cartfile */ = {isa = PBXFileReference; lastKnownFileType = text; path = Cartfile; sourceTree = ""; }; + 2E144D41862144B591B0C49A /* KVOBlock.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KVOBlock.framework; path = /Luoo/ScrollviewBatchFetchingable/Carthage/Build/iOS/KVOBlock.framework; sourceTree = ""; }; 607FACD01AFB9204008FA782 /* ScrollviewBatchFetchingable_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScrollviewBatchFetchingable_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -58,11 +65,18 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 10CFED3E1F1E102A00CBCA32 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 16061A8D1D002D8200055A4B /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 16061AA11D002DEC00055A4B /* KVOBlock.framework in Frameworks */, + AD52A9D7E6DD4C989BB09D51 /* KVOBlock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -71,16 +85,26 @@ buildActionMask = 2147483647; files = ( 16061A981D002D8200055A4B /* ScrollviewBatchFetchingable.framework in Frameworks */, + E7588299A4EA4B6789848CC9 /* KVOBlock.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 10CFED431F1E102A00CBCA32 /* ScrollviewBatchFetchingable macOS */ = { + isa = PBXGroup; + children = ( + 10CFED441F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.h */, + 10CFED451F1E102A00CBCA32 /* Info.plist */, + ); + path = "ScrollviewBatchFetchingable macOS"; + sourceTree = ""; + }; 16061A921D002D8200055A4B /* ScrollviewBatchFetchingable */ = { isa = PBXGroup; children = ( - 166F12E21D0031D400778775 /* UIScrollView+SSBatchContext.swift */, + 166F12E21D0031D400778775 /* ScrollView+SSBatchContext.swift */, 16061A931D002D8200055A4B /* ScrollviewBatchFetchingable.h */, 16061A951D002D8200055A4B /* Info.plist */, ); @@ -90,12 +114,14 @@ 607FACC71AFB9204008FA782 = { isa = PBXGroup; children = ( + 10FD67D41F1B0B140086C6B4 /* Default-568h@2x.png */, 16DF19DE1DC3080100370525 /* Cartfile */, - 16061AA01D002DEC00055A4B /* KVOBlock.framework */, 607FACF51AFB993E008FA782 /* Podspec Metadata */, 607FACD21AFB9204008FA782 /* Example for ScrollviewBatchFetchingable */, 16061A921D002D8200055A4B /* ScrollviewBatchFetchingable */, + 10CFED431F1E102A00CBCA32 /* ScrollviewBatchFetchingable macOS */, 607FACD11AFB9204008FA782 /* Products */, + AAE0D009B2F64953AF774378 /* Frameworks */, ); sourceTree = ""; }; @@ -104,6 +130,7 @@ children = ( 607FACD01AFB9204008FA782 /* ScrollviewBatchFetchingable_Example.app */, 16061A911D002D8200055A4B /* ScrollviewBatchFetchingable.framework */, + 10CFED421F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.framework */, ); name = Products; sourceTree = ""; @@ -136,9 +163,33 @@ name = "Podspec Metadata"; sourceTree = ""; }; + AAE0D009B2F64953AF774378 /* Frameworks */ = { + isa = PBXGroup; + children = ( + AB6E0DE209B64665BC47CD28 /* iOS */, + ); + name = Frameworks; + sourceTree = ""; + }; + AB6E0DE209B64665BC47CD28 /* iOS */ = { + isa = PBXGroup; + children = ( + 2E144D41862144B591B0C49A /* KVOBlock.framework */, + ); + name = iOS; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ + 10CFED3F1F1E102A00CBCA32 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 10CFED461F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 16061A8E1D002D8200055A4B /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -150,6 +201,24 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ + 10CFED411F1E102A00CBCA32 /* ScrollviewBatchFetchingable macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = 10CFED471F1E102A00CBCA32 /* Build configuration list for PBXNativeTarget "ScrollviewBatchFetchingable macOS" */; + buildPhases = ( + 10CFED3D1F1E102A00CBCA32 /* Sources */, + 10CFED3E1F1E102A00CBCA32 /* Frameworks */, + 10CFED3F1F1E102A00CBCA32 /* Headers */, + 10CFED401F1E102A00CBCA32 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "ScrollviewBatchFetchingable macOS"; + productName = "ScrollviewBatchFetchingable macOS"; + productReference = 10CFED421F1E102A00CBCA32 /* ScrollviewBatchFetchingable_macOS.framework */; + productType = "com.apple.product-type.framework"; + }; 16061A901D002D8200055A4B /* ScrollviewBatchFetchingable */ = { isa = PBXNativeTarget; buildConfigurationList = 16061A9A1D002D8200055A4B /* Build configuration list for PBXNativeTarget "ScrollviewBatchFetchingable" */; @@ -176,6 +245,7 @@ 607FACCD1AFB9204008FA782 /* Frameworks */, 607FACCE1AFB9204008FA782 /* Resources */, 16061A9D1D002D8200055A4B /* Embed Frameworks */, + 0317DB6D4CBE400BA9AE63E6 /* [XMan Copy Framework] */, ); buildRules = ( ); @@ -194,17 +264,22 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0720; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = CocoaPods; TargetAttributes = { + 10CFED411F1E102A00CBCA32 = { + CreatedOnToolsVersion = 9.0; + DevelopmentTeam = L5W9FHSX92; + }; 16061A901D002D8200055A4B = { CreatedOnToolsVersion = 7.3.1; DevelopmentTeam = NR6298RRHY; - LastSwiftMigration = 0800; + LastSwiftMigration = 0900; }; 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; - DevelopmentTeam = NR6298RRHY; + DevelopmentTeam = L5W9FHSX92; + ProvisioningStyle = Automatic; }; }; }; @@ -223,11 +298,19 @@ targets = ( 607FACCF1AFB9204008FA782 /* ScrollviewBatchFetchingable_Example */, 16061A901D002D8200055A4B /* ScrollviewBatchFetchingable */, + 10CFED411F1E102A00CBCA32 /* ScrollviewBatchFetchingable macOS */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 10CFED401F1E102A00CBCA32 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 16061A8F1D002D8200055A4B /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -246,12 +329,38 @@ }; /* End PBXResourcesBuildPhase section */ +/* Begin PBXShellScriptBuildPhase section */ + 0317DB6D4CBE400BA9AE63E6 /* [XMan Copy Framework] */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "$(SRCROOT)/Carthage/Build/iOS/KVOBlock.framework", + ); + name = "[XMan Copy Framework]"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/usr/local/bin/punic copy-frameworks\n#$(SRCROOT)/Carthage/Build/iOS/.framework"; + }; +/* End PBXShellScriptBuildPhase section */ + /* Begin PBXSourcesBuildPhase section */ + 10CFED3D1F1E102A00CBCA32 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 10CFED4A1F1E105100CBCA32 /* ScrollView+SSBatchContext.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 16061A8C1D002D8200055A4B /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 166F12E31D0031D400778775 /* UIScrollView+SSBatchContext.swift in Sources */, + 166F12E31D0031D400778775 /* ScrollView+SSBatchContext.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -294,6 +403,72 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 10CFED481F1E102A00CBCA32 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEBUG_INFORMATION_FORMAT = dwarf; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = L5W9FHSX92; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "ScrollviewBatchFetchingable macOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + PRODUCT_BUNDLE_IDENTIFIER = "com.SelfStudio.ScrollviewBatchFetchingable-macOS"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 10CFED491F1E102A00CBCA32 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "Mac Developer"; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + DEFINES_MODULE = YES; + DEVELOPMENT_TEAM = L5W9FHSX92; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_VERSION = A; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = "ScrollviewBatchFetchingable macOS/Info.plist"; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.10; + PRODUCT_BUNDLE_IDENTIFIER = "com.SelfStudio.ScrollviewBatchFetchingable-macOS"; + PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; + SDKROOT = macosx; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; 16061A9B1D002D8200055A4B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -307,19 +482,25 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + "ENABLE_BITCODE[sdk=macosx*]" = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = ScrollviewBatchFetchingable/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = com.SelfStudio.ScrollviewBatchFetchingable; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; SKIP_INSTALL = YES; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -337,18 +518,24 @@ DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; DYLIB_INSTALL_NAME_BASE = "@rpath"; + ENABLE_BITCODE = YES; + "ENABLE_BITCODE[sdk=macosx*]" = NO; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/Carthage/Build/iOS", ); INFOPLIST_FILE = ScrollviewBatchFetchingable/Info.plist; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MACOSX_DEPLOYMENT_TARGET = 10.9; PRODUCT_BUNDLE_IDENTIFIER = com.SelfStudio.ScrollviewBatchFetchingable; PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; + SWIFT_SWIFT3_OBJC_INFERENCE = Default; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -363,13 +550,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -408,13 +603,21 @@ CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -433,6 +636,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.3; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; VALIDATE_PRODUCT = YES; }; name = Release; @@ -440,34 +644,54 @@ 607FACF01AFB9204008FA782 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = NR6298RRHY; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = L5W9FHSX92; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; INFOPLIST_FILE = ScrollviewBatchFetchingable/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 4.0; }; name = Debug; }; 607FACF11AFB9204008FA782 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - DEVELOPMENT_TEAM = NR6298RRHY; - EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = L5W9FHSX92; + FRAMEWORK_SEARCH_PATHS = "$(PROJECT_DIR)/Carthage/Build/iOS"; INFOPLIST_FILE = ScrollviewBatchFetchingable/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @loader_path/Frameworks @executable_path/Frameworks"; MODULE_NAME = ExampleApp; PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_VERSION = 4.0; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 10CFED471F1E102A00CBCA32 /* Build configuration list for PBXNativeTarget "ScrollviewBatchFetchingable macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 10CFED481F1E102A00CBCA32 /* Debug */, + 10CFED491F1E102A00CBCA32 /* Release */, + ); + defaultConfigurationIsVisible = 0; + }; 16061A9A1D002D8200055A4B /* Build configuration list for PBXNativeTarget "ScrollviewBatchFetchingable" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable-Example.xcscheme b/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable macOS.xcscheme similarity index 50% rename from ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable-Example.xcscheme rename to ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable macOS.xcscheme index c1e1fda..a052eee 100644 --- a/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable-Example.xcscheme +++ b/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable macOS.xcscheme @@ -1,6 +1,6 @@ - - - - @@ -40,28 +26,10 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" shouldUseLaunchSchemeArgsEnv = "YES"> - - - - - - - - @@ -69,22 +37,22 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" debugDocumentVersioning = "YES" debugServiceExtension = "internal" allowLocationSimulation = "YES"> - + - + @@ -94,16 +62,15 @@ savedToolIdentifier = "" useCustomWorkingDirectory = "NO" debugDocumentVersioning = "YES"> - + - + diff --git a/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable.xcscheme b/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable.xcscheme index 6ce8121..a76ceb9 100644 --- a/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable.xcscheme +++ b/ScrollviewBatchFetchingable.xcodeproj/xcshareddata/xcschemes/ScrollviewBatchFetchingable.xcscheme @@ -1,6 +1,6 @@ @@ -36,6 +37,7 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + language = "" launchStyle = "0" useCustomWorkingDirectory = "NO" ignoresPersistentStateOnLaunch = "NO" diff --git a/ScrollviewBatchFetchingable/Base.lproj/Main.storyboard b/ScrollviewBatchFetchingable/Base.lproj/Main.storyboard index 52ea29e..397e074 100644 --- a/ScrollviewBatchFetchingable/Base.lproj/Main.storyboard +++ b/ScrollviewBatchFetchingable/Base.lproj/Main.storyboard @@ -1,21 +1,26 @@ - - + + + + + - + + + - + - + - + diff --git a/ScrollviewBatchFetchingable/Info.plist b/ScrollviewBatchFetchingable/Info.plist index d3de8ee..8e69d3f 100644 --- a/ScrollviewBatchFetchingable/Info.plist +++ b/ScrollviewBatchFetchingable/Info.plist @@ -22,5 +22,9 @@ $(CURRENT_PROJECT_VERSION) NSPrincipalClass + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main diff --git a/ScrollviewBatchFetchingable/ScrollviewBatchFetchingable.h b/ScrollviewBatchFetchingable/ScrollviewBatchFetchingable.h index 8cd2fa8..6ec761e 100644 --- a/ScrollviewBatchFetchingable/ScrollviewBatchFetchingable.h +++ b/ScrollviewBatchFetchingable/ScrollviewBatchFetchingable.h @@ -5,9 +5,12 @@ // Created by LawLincoln on 16/6/2. // Copyright © 2016年 CocoaPods. All rights reserved. // - +#import +#if TARGET_OS_IOS #import - +#elif TARGET_OS_OSX +#import +#endif //! Project version number for ScrollviewBatchFetchingable. FOUNDATION_EXPORT double ScrollviewBatchFetchingableVersionNumber; diff --git a/Source/ScrollView+SSBatchContext.swift b/Source/ScrollView+SSBatchContext.swift new file mode 100644 index 0000000..37aefa4 --- /dev/null +++ b/Source/ScrollView+SSBatchContext.swift @@ -0,0 +1,185 @@ +// +// UITableView+PageLoadable.swift +// LuooFM +// +// Created by LawLincoln on 16/4/18. +// Copyright © 2016年 Luoo.net. All rights reserved. +// + +#if os(iOS) + import UIKit + public typealias ScrollView = UIScrollView + import KVOBlock +#elseif os(OSX) + import Cocoa + public typealias ScrollView = NSScrollView +#endif +private struct AssociatedKeys { + static var LeadingScreensForBatching = "LeadingScreensForBatching" + static var Observer = "Observer" +} + +public enum SSBatchContextState { case fetching, cancelled, completed } + +public final class SSBatchContext { + + fileprivate lazy var _state: SSBatchContextState = .completed + + + + fileprivate let _lockQueue = DispatchQueue(label: "com.SelfStudio.SSBatchContext.LockQueue", attributes: []) + + fileprivate func performLock(_ closure: () -> ()) { + _lockQueue.sync { closure() } + } + + public var fetching: Bool { + let sem = DispatchSemaphore(value: 0) + var isFetching = false + _lockQueue.async(execute: { () -> Void in + isFetching = self._state == .fetching + sem.signal() + }) + _ = sem.wait(timeout: DispatchTime.distantFuture) + return isFetching + } + + public func batchFetchingWasCancelled() { + performLock { self._state = .cancelled } + } + + public func completeBatchFetching(_ didComplete: Bool) { + if !didComplete { return } + performLock { self._state = .completed } + } + + public func beginBatchFetching() { + performLock { self._state = .fetching } + } + + public func cancelBatchFetching() { + performLock { self._state = .cancelled } + } +} + +private final class ScrollObserver: NSObject { + + fileprivate weak var _scrollview: ScrollView? + fileprivate lazy var _context: SSBatchContext = SSBatchContext() + + weak var _delegate: ScrollviewBatchFetchingable? + private var _observer: NSObjectProtocol? + + init(view: ScrollView) { + super.init() + _scrollview = view + addObserver() + } + + deinit { + _delegate = nil + guard let ob = _observer else { return } + NotificationCenter.default.removeObserver(ob) + } + + fileprivate func addObserver() { + #if os(iOS) + _scrollview?.observeKeyPath("contentOffset", with: { [weak self](_, _, _) in + self?.dealChange() + }) + #elseif os(OSX) + _scrollview?.contentView.postsFrameChangedNotifications = true + _scrollview?.contentView.postsBoundsChangedNotifications = true + + _observer = NotificationCenter.default.addObserver(forName: NSView.boundsDidChangeNotification, object: nil, queue: OperationQueue.main) { [unowned self] _ in + self.dealChange() + } + + #endif + } + + private func dealChange() { + guard let value = _scrollview else { return } + if _context._state != .fetching && value.ss_leadingScreensForBatching > 0 { + + let bounds = value.bounds + // no fetching for null states + if bounds.equalTo(CGRect.zero) { return } + + let leadingScreens = value.ss_leadingScreensForBatching + #if os(iOS) + let contentSize = value.contentSize + let contentOffset = value.contentOffset + #elseif os(OSX) + let contentSize = value.documentView?.frame.size ?? .zero + let contentOffset = value.contentView.bounds.origin + #endif + + let isVertical = bounds.width == contentSize.width + + var viewLength: CGFloat = 0 + var offset: CGFloat = 0 + var contentLength: CGFloat = 0 + + if isVertical { + viewLength = bounds.height + offset = contentOffset.y + contentLength = contentSize.height + } else { // horizontal + viewLength = bounds.width + offset = contentOffset.x + contentLength = contentSize.width + } + // target offset will always be 0 if the content size is smaller than the viewport + let triggerDistance = viewLength * leadingScreens + let remainingDistance = contentLength - viewLength - offset + if abs(remainingDistance) <= triggerDistance { + if let p = value as? ScrollviewBatchFetchingable { + _context._state = .fetching + p.scrollView(value, willBeginBatchFetchWithContext: _context) + } else { + _context._state = .fetching + _delegate?.scrollView(value, willBeginBatchFetchWithContext: _context) + } + } + } + } +} + +public extension ScrollView { + + /// Default is 0, set value to enable, if value < 0 will disable + public var ss_leadingScreensForBatching: CGFloat { + get { + var factor: CGFloat = 0 + if let value = objc_getAssociatedObject(self, &AssociatedKeys.LeadingScreensForBatching) as? CGFloat { + factor = value + } + return factor + } + set(factor) { + if factor > 0 { + if ss_ob == nil { + ss_ob = ScrollObserver(view: self) + } + } else { + ss_ob = nil + } + objc_setAssociatedObject(self, &AssociatedKeys.LeadingScreensForBatching, factor, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) + } + } + + fileprivate var ss_ob: ScrollObserver? { + get { return objc_getAssociatedObject(self, &AssociatedKeys.Observer) as? ScrollObserver } + set(ob) { objc_setAssociatedObject(self, &AssociatedKeys.Observer, ob, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } + } + + public func setBatchDelegate(_ delegate: ScrollviewBatchFetchingable?) { + ss_ob?._delegate = delegate + } + +} + +public protocol ScrollviewBatchFetchingable: class { + func scrollView(_ scrollView: ScrollView, willBeginBatchFetchWithContext context: SSBatchContext) +} diff --git a/Source/UIScrollView+SSBatchContext.swift b/Source/UIScrollView+SSBatchContext.swift deleted file mode 100644 index 25343a3..0000000 --- a/Source/UIScrollView+SSBatchContext.swift +++ /dev/null @@ -1,165 +0,0 @@ -// -// UITableView+PageLoadable.swift -// LuooFM -// -// Created by LawLincoln on 16/4/18. -// Copyright © 2016年 Luoo.net. All rights reserved. -// - -import UIKit -import KVOBlock -private struct AssociatedKeys { - static var LeadingScreensForBatching = "LeadingScreensForBatching" - static var Observer = "Observer" -} - -public enum SSBatchContextState { case fetching, cancelled, completed } - -public final class SSBatchContext { - - fileprivate lazy var _state: SSBatchContextState = .completed - - - - fileprivate let _lockQueue = DispatchQueue(label: "com.SelfStudio.SSBatchContext.LockQueue", attributes: []) - - fileprivate func performLock(_ closure: () -> ()) { - _lockQueue.sync { closure() } - } - - public var fetching: Bool { - let sem = DispatchSemaphore(value: 0) - var isFetching = false - _lockQueue.async(execute: { () -> Void in - isFetching = self._state == .fetching - sem.signal() - }) - _ = sem.wait(timeout: DispatchTime.distantFuture) - return isFetching - } - - public func batchFetchingWasCancelled() { - performLock { self._state = .cancelled } - } - - public func completeBatchFetching(_ didComplete: Bool) { - if !didComplete { return } - performLock { self._state = .completed } - } - - public func beginBatchFetching() { - performLock { self._state = .fetching } - } - - public func cancelBatchFetching() { - performLock { self._state = .cancelled } - } -} - -private final class ScrollObserver: NSObject { - - fileprivate weak var _scrollview: UIScrollView? - fileprivate lazy var _context: SSBatchContext = SSBatchContext() - - weak var _delegate: ScrollviewBatchFetchingable? - - init(view: UIScrollView) { - super.init() - _scrollview = view - addObserver() - } - - deinit { - _delegate = nil - } - - fileprivate func addObserver() { - _scrollview?.observeKeyPath("contentOffset", with: { [weak self](_, _, _) in - guard let sself = self, let value = sself._scrollview else { return } - - if sself._context._state != .fetching && value.ss_leadingScreensForBatching > 0 { - - let bounds = value.bounds - // no fetching for null states - if bounds.equalTo(CGRect.zero) { return } - - let leadingScreens = value.ss_leadingScreensForBatching - let contentSize = value.contentSize - let contentOffset = value.contentOffset - let isVertical = bounds.width == contentSize.width - - var viewLength: CGFloat = 0 - var offset: CGFloat = 0 - var contentLength: CGFloat = 0 - - if isVertical { - viewLength = bounds.height - offset = contentOffset.y - contentLength = contentSize.height - } else { // horizontal - viewLength = bounds.width - offset = contentOffset.x - contentLength = contentSize.width - } - - // target offset will always be 0 if the content size is smaller than the viewport - - let triggerDistance = viewLength * leadingScreens - let remainingDistance = contentLength - viewLength - offset - - if remainingDistance <= triggerDistance && remainingDistance > 0 { - - if let p = value as? ScrollviewBatchFetchingable { - sself._context._state = .fetching - p.scrollView(value, willBeginBatchFetchWithContext: sself._context) - } else { - sself._context._state = .fetching - sself._delegate?.scrollView(value, willBeginBatchFetchWithContext: sself._context) - } - - } - } - - }) - - } - -} - -public extension UIScrollView { - - /// Default is 0, set value to enable, if value < 0 will disable - public var ss_leadingScreensForBatching: CGFloat { - get { - var factor: CGFloat = 0 - if let value = objc_getAssociatedObject(self, &AssociatedKeys.LeadingScreensForBatching) as? CGFloat { - factor = value - } - return factor - } - set(factor) { - if factor > 0 { - if ss_ob == nil { - ss_ob = ScrollObserver(view: self) - } - } else { - ss_ob = nil - } - objc_setAssociatedObject(self, &AssociatedKeys.LeadingScreensForBatching, factor, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) - } - } - - fileprivate var ss_ob: ScrollObserver? { - get { return objc_getAssociatedObject(self, &AssociatedKeys.Observer) as? ScrollObserver } - set(ob) { objc_setAssociatedObject(self, &AssociatedKeys.Observer, ob, .OBJC_ASSOCIATION_RETAIN_NONATOMIC) } - } - - public func setBatchDelegate(_ delegate: ScrollviewBatchFetchingable?) { - ss_ob?._delegate = delegate - } - -} - -public protocol ScrollviewBatchFetchingable: class { - func scrollView(_ scrollView: UIScrollView, willBeginBatchFetchWithContext context: SSBatchContext) -} diff --git a/xman.yaml b/xman.yaml new file mode 100644 index 0000000..2119ee1 --- /dev/null +++ b/xman.yaml @@ -0,0 +1,14 @@ +# project: "path/to/your/*.xcodeproj" # if not config, will get first xcodeproj in directory +# carthage_folder: "./Carthage" # if not config, will be the `Carthage` folder in directory +framework_copy_tool: "/usr/local/bin/punic" # if not config, will using `/usr/local/bin/carthage` +carthage_frameworks: # custom framework array + - KVOBlock # framework name in `Carthage/Build/iOS` without `.framework` +target_configuration: + - ScrollviewBatchFetchingable: # target name + platform: iOS #Mac + deployment_target: "9.0" # for target + common_frameworks_key: "carthage_frameworks" # custom framework key + - ScrollviewBatchFetchingable_Example: # target name + platform: iOS #Mac + deployment_target: "9.0" # for target + common_frameworks_key: "carthage_frameworks" # custom framework key