diff --git a/.gitignore b/.gitignore index 5192b08..b2e3198 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,40 @@ +# Mac OSX +# +.DS_Store + +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate +*.xcscmblueprint + # CocoaPods # # We recommend against adding the Pods directory to your .gitignore. However # you should judge for yourself, the pros and cons are mentioned at: -# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control? +# http://guides.cocoapods.org/using/using-cocoapods.html#should-i-ignore-the-pods-directory-in-source-control # -xcuserdata/ -*.xccheckout -*.gcno -*.gcda +# Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build + + diff --git a/.swift-version b/.swift-version new file mode 100644 index 0000000..5186d07 --- /dev/null +++ b/.swift-version @@ -0,0 +1 @@ +4.0 diff --git a/CHANGELOG.md b/CHANGELOG.md index cdeb175..0171050 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,64 @@ +4.0.0 Release notes (2017-10-31) +============================================================= + +### Enhancements +* Support Swift4.0 + +### Bugfixes +* None. + + +3.0.2 Release notes (2017-08-23) +============================================================= + +### Enhancements +* Added option `animationOptions`. + +### Bugfixes +* Respect root view controller’s preferredStatusBarStyle. + + +3.0.1 Release notes (2016-12-02) +============================================================= + +### Enhancements +* Added options `panGesturesEnabled` and `tapGesturesEnabled`. + Options defaults are of course set to enabled/true so no impact to anyone already using this. + +### Bugfixes +* Fix project settings. + + +3.0.0 Release notes (2016-09-12) +============================================================= + +### Enhancements +* Support Swift3.0 + +### Bugfixes +* None. + + +2.3.0 Release notes (2016-09-12) +============================================================= + +### Enhancements +* Support Swift2.3 + +### Bugfixes +* None. + + +2.2.3 Release notes (2016-09-12) +============================================================= + +### Enhancements +* None. + +### Bugfixes +* Added viewWillAppear on mainViewController when SlideMenuController appears on screen +* Fixes sample project image. + 2.2.2 Release notes (2016-07-15) ============================================================= diff --git a/README.md b/README.md index 359e952..dad4d3f 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,15 @@ SlideMenuControllerSwift ======================== -[![Platform](http://img.shields.io/badge/platform-ios-blue.svg?style=flat +[![Platform](http://img.shields.io/badge/platform-iOS-blue.svg?style=flat )](https://developer.apple.com/iphone/index.action) -[![Language](http://img.shields.io/badge/language-swift-brightgreen.svg?style=flat +[![Language](http://img.shields.io/badge/language-Swift-brightgreen.svg?style=flat )](https://developer.apple.com/swift) [![License](http://img.shields.io/badge/license-MIT-lightgrey.svg?style=flat )](http://mit-license.org) [![Issues](https://img.shields.io/github/issues/dekatotoro/SlideMenuControllerSwift.svg?style=flat )](https://github.com/dekatotoro/SlideMenuControllerSwift/issues?state=open) +[![Downloads](https://img.shields.io/cocoapods/dt/SlideMenuControllerSwift.svg)](https://cocoapods.org/pods/SlideMenuControllerSwift) @@ -16,14 +17,14 @@ iOS Slide View based on iQON, Feedly, Google+, Ameba iPhone app. ![sample](Screenshots/SlideMenuControllerSwift3.gif) -##Installation +## Installation -####CocoaPods +#### CocoaPods ``` pod 'SlideMenuControllerSwift' ``` - -####Carthage + +#### Carthage if iOS8 or later, Carthage is supported @@ -32,12 +33,12 @@ if iOS8 or later, Carthage is supported for more info, see [Carthage](https://github.com/carthage/carthage) -####Manually -Add the `SlideMenuController.swift` file to your project. +#### Manually +Add the `SlideMenuController.swift` file to your project. -##Usage +## Usage -###Setup +### Setup Add `import SlideMenuControllerSwift` in your file @@ -48,7 +49,7 @@ In your app delegate: func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // create viewController code... - + let slideMenuController = SlideMenuController(mainViewController: mainViewController, leftMenuViewController: leftViewController, rightMenuViewController: rightViewController) self.window?.rootViewController = slideMenuController self.window?.makeKeyAndVisible() @@ -57,7 +58,7 @@ func application(application: UIApplication, didFinishLaunchingWithOptions launc } ``` -####Storyboard Support +#### Storyboard Support 1. Inherit `SlideMenuController` and put UIViewController in a storyboard. 2. Override `awakeFromNib`, then instantiate any view controllers @@ -84,10 +85,10 @@ If you want to use the custom option, please set them before calling the init me SlideMenuOptions.leftViewWidth = 50 SlideMenuOptions.contentViewScale = .50 ... - + ``` -###You can access from UIViewController +### You can access from UIViewController ```swift self.slideMenuController()? @@ -98,7 +99,7 @@ if let slideMenuController = self.slideMenuController() { // some code } ``` -### add navigationBarButton +### add navigationBarButton ```swift viewController.addLeftBarButtonWithImage(UIImage(named: "hoge")!) viewController.addRightBarButtonWithImage(UIImage(named: "fuga")!) @@ -128,12 +129,10 @@ func rightDidClose() ``` ## Requirements -Requires Swift2.0 and iOS 8.0 and ARC. -If you are developing in the swift1.1, please use branch of swift1.1. -If you are developing in the swift1.2, please use branch of swift1.2. -If you are developing in the swift2.1, please use branch of swift2.1. -If you want to use even iOS7.0, please to import the code directly. -If you want to use objective-c even iOS6.0, plesea use [SlideMenuControllerOC](https://github.com/Pluto-Y/SlideMenuControllerOC). +Requires Swift4.0 and iOS 9.0 and ARC. +If you are developing in the Swift1.1 ~ 3.2, please use branch of swift1.1 ~ 3. +If you want to use even iOS8.0, please to import the code directly. +If you want to use objective-c even iOS6.0, plesea use [SlideMenuControllerOC](https://github.com/Pluto-Y/SlideMenuControllerOC). ## Features - Highly customizable @@ -145,7 +144,7 @@ Forks, patches and other feedback are welcome. ## Creator ### SlideMenuControllerSwift -[Yuji Hato](https://github.com/dekatotoro) +[Yuji Hato](https://github.com/dekatotoro) [Blog](http://buzzmemo.blogspot.jp/) ### SlideMenuControllerOC diff --git a/SlideMenuControllerSwift.podspec b/SlideMenuControllerSwift.podspec index b783edd..4512a61 100644 --- a/SlideMenuControllerSwift.podspec +++ b/SlideMenuControllerSwift.podspec @@ -1,15 +1,14 @@ Pod::Spec.new do |s| s.name = "SlideMenuControllerSwift" - s.version = "2.2.2" + s.version = "4.0.0" s.summary = "iOS Slide View based on iQON, Feedly, Google+, Ameba iPhone app." s.homepage = "https://github.com/dekatotoro/SlideMenuControllerSwift" s.license = { :type => "MIT", :file => "LICENSE" } s.author = { "Yuji Hato" => "hatoyujidev@gmail.com" } s.social_media_url = "https://twitter.com/dekatotoro" s.platform = :ios - s.ios.deployment_target = "8.0" + s.ios.deployment_target = "9.0" s.source = { :git => "https://github.com/dekatotoro/SlideMenuControllerSwift.git", :tag => s.version } - s.source_files = "Source/*" + s.source_files = "Source/*.swift" s.requires_arc = true end - diff --git a/SlideMenuControllerSwift.xcodeproj/project.pbxproj b/SlideMenuControllerSwift.xcodeproj/project.pbxproj index 951ac31..b7cc546 100644 --- a/SlideMenuControllerSwift.xcodeproj/project.pbxproj +++ b/SlideMenuControllerSwift.xcodeproj/project.pbxproj @@ -323,7 +323,7 @@ attributes = { LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0710; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = "Yuji Hato"; TargetAttributes = { 0E75C5951BE3CA7900844634 = { @@ -331,9 +331,11 @@ }; C539E6401A315E87003B7CC7 = { CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0800; }; C539E6581A315E87003B7CC7 = { CreatedOnToolsVersion = 6.1.1; + LastSwiftMigration = 0800; TestTargetID = C539E6401A315E87003B7CC7; }; }; @@ -469,6 +471,7 @@ 0E75C59F1BE3CA7900844634 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; @@ -484,6 +487,7 @@ PRODUCT_BUNDLE_IDENTIFIER = dekatotoro.SlideMenuControllerSwift; PRODUCT_NAME = "$(PROJECT_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -492,6 +496,7 @@ 0E75C5A01BE3CA7900844634 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -507,6 +512,7 @@ PRODUCT_BUNDLE_IDENTIFIER = dekatotoro.SlideMenuControllerSwift; PRODUCT_NAME = "$(PROJECT_NAME)"; SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -520,13 +526,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"; @@ -535,6 +549,7 @@ ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", @@ -552,6 +567,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -564,13 +580,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"; @@ -578,6 +602,7 @@ ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -587,6 +612,8 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -601,6 +628,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "dekatotoro.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -612,8 +640,10 @@ INFOPLIST_FILE = SlideMenuControllerSwift/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 8.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "dekatotoro.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; @@ -622,10 +652,7 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -634,6 +661,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "dekatotoro.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SlideMenuControllerSwift.app/SlideMenuControllerSwift"; }; name = Debug; @@ -642,14 +670,12 @@ isa = XCBuildConfiguration; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = SlideMenuControllerSwiftTests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "dekatotoro.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SlideMenuControllerSwift.app/SlideMenuControllerSwift"; }; name = Release; diff --git a/SlideMenuControllerSwift.xcodeproj/xcshareddata/xcschemes/SlideMenuControllerSwift-iOS.xcscheme b/SlideMenuControllerSwift.xcodeproj/xcshareddata/xcschemes/SlideMenuControllerSwift-iOS.xcscheme index 2a00476..e2b0e67 100644 --- a/SlideMenuControllerSwift.xcodeproj/xcshareddata/xcschemes/SlideMenuControllerSwift-iOS.xcscheme +++ b/SlideMenuControllerSwift.xcodeproj/xcshareddata/xcschemes/SlideMenuControllerSwift-iOS.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/SlideMenuControllerSwift.xcodeproj/xcuserdata/a12447.xcuserdatad/xcschemes/SlideMenuControllerSwift.xcscheme b/SlideMenuControllerSwift.xcodeproj/xcuserdata/a12447.xcuserdatad/xcschemes/SlideMenuControllerSwift.xcscheme index bf578da..2b3e0c2 100644 --- a/SlideMenuControllerSwift.xcodeproj/xcuserdata/a12447.xcuserdatad/xcschemes/SlideMenuControllerSwift.xcscheme +++ b/SlideMenuControllerSwift.xcodeproj/xcuserdata/a12447.xcuserdatad/xcschemes/SlideMenuControllerSwift.xcscheme @@ -1,6 +1,6 @@ Bool { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { self.createMenuView() return true } - func applicationWillResignActive(application: UIApplication) { + func applicationWillResignActive(_ application: UIApplication) { // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. } - func applicationDidEnterBackground(application: UIApplication) { + func applicationDidEnterBackground(_ application: UIApplication) { // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. } - func applicationWillEnterForeground(application: UIApplication) { + func applicationWillEnterForeground(_ application: UIApplication) { // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. } - func applicationDidBecomeActive(application: UIApplication) { + func applicationDidBecomeActive(_ application: UIApplication) { // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. } - func applicationWillTerminate(application: UIApplication) { + func applicationWillTerminate(_ application: UIApplication) { // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. // Saves changes in the application's managed object context before the application terminates. self.saveContext() @@ -70,39 +70,39 @@ class AppDelegate: UIResponder, UIApplicationDelegate { // MARK: - Core Data stack - lazy var applicationDocumentsDirectory: NSURL = { + lazy var applicationDocumentsDirectory: URL = { // The directory the application uses to store the Core Data store file. This code uses a directory named "dekatotoro.test11" in the application's documents Application Support directory. - let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask) + let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) return urls[urls.count-1] }() lazy var managedObjectModel: NSManagedObjectModel = { // The managed object model for the application. This property is not optional. It is a fatal error for the application not to be able to find and load its model. - let modelURL = NSBundle.mainBundle().URLForResource("test11", withExtension: "momd")! - return NSManagedObjectModel(contentsOfURL: modelURL)! + let modelURL = Bundle.main.url(forResource: "test11", withExtension: "momd")! + return NSManagedObjectModel(contentsOf: modelURL)! }() lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = { // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail. // Create the coordinator and store var coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel) - let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("test11.sqlite") + let url = self.applicationDocumentsDirectory.appendingPathComponent("test11.sqlite") var error: NSError? = nil var failureReason = "There was an error creating or loading the application's saved data." do { - try coordinator!.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil) + try coordinator!.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil) } catch var error1 as NSError { error = error1 coordinator = nil // Report any error we got. var dict = [String: AnyObject]() - dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" - dict[NSLocalizedFailureReasonErrorKey] = failureReason + dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject? + dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject? dict[NSUnderlyingErrorKey] = error error = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict) // Replace this with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - NSLog("Unresolved error \(error), \(error!.userInfo)") + NSLog("Unresolved error \(error?.debugDescription ?? ""), \(error?.userInfo.debugDescription ?? "")") abort() } catch { fatalError() @@ -134,7 +134,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { error = error1 // Replace this implementation with code to handle the error appropriately. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. - NSLog("Unresolved error \(error), \(error!.userInfo)") + NSLog("Unresolved error \(error?.debugDescription ?? ""), \(error?.userInfo.debugDescription ?? "")") abort() } } diff --git a/SlideMenuControllerSwift/Base.lproj/Main.storyboard b/SlideMenuControllerSwift/Base.lproj/Main.storyboard index 1b5e49b..fcb7db9 100644 --- a/SlideMenuControllerSwift/Base.lproj/Main.storyboard +++ b/SlideMenuControllerSwift/Base.lproj/Main.storyboard @@ -1,8 +1,9 @@ - + - + + @@ -18,24 +19,23 @@ - - + + + @@ -54,18 +54,15 @@ - - - - + + - - + @@ -96,17 +93,14 @@ - - - + - - + @@ -114,6 +108,8 @@ + + @@ -134,25 +130,24 @@ - - + + + @@ -171,25 +166,24 @@ - - + + + @@ -208,25 +202,24 @@ - - + + + @@ -245,35 +238,30 @@ - - + @@ -281,6 +269,8 @@ + + diff --git a/SlideMenuControllerSwift/BaseTableViewCell.swift b/SlideMenuControllerSwift/BaseTableViewCell.swift index 84789f9..9927cec 100644 --- a/SlideMenuControllerSwift/BaseTableViewCell.swift +++ b/SlideMenuControllerSwift/BaseTableViewCell.swift @@ -7,7 +7,7 @@ // import UIKit -public class BaseTableViewCell : UITableViewCell { +open class BaseTableViewCell : UITableViewCell { class var identifier: String { return String.className(self) } public required init?(coder aDecoder: NSCoder) { @@ -20,26 +20,26 @@ public class BaseTableViewCell : UITableViewCell { setup() } - public override func awakeFromNib() { + open override func awakeFromNib() { } - public func setup() { + open func setup() { } - public class func height() -> CGFloat { + open class func height() -> CGFloat { return 48 } - public func setData(data: Any?) { + open func setData(_ data: Any?) { self.backgroundColor = UIColor(hex: "F1F8E9") - self.textLabel?.font = UIFont.italicSystemFontOfSize(18) + self.textLabel?.font = UIFont.italicSystemFont(ofSize: 18) self.textLabel?.textColor = UIColor(hex: "9E9E9E") if let menuText = data as? String { self.textLabel?.text = menuText } } - override public func setHighlighted(highlighted: Bool, animated: Bool) { + override open func setHighlighted(_ highlighted: Bool, animated: Bool) { if highlighted { self.alpha = 0.4 } else { @@ -48,7 +48,7 @@ public class BaseTableViewCell : UITableViewCell { } // ignore the default handling - override public func setSelected(selected: Bool, animated: Bool) { + override open func setSelected(_ selected: Bool, animated: Bool) { } } diff --git a/SlideMenuControllerSwift/DataTableViewCell.swift b/SlideMenuControllerSwift/DataTableViewCell.swift index e882050..39444bf 100644 --- a/SlideMenuControllerSwift/DataTableViewCell.swift +++ b/SlideMenuControllerSwift/DataTableViewCell.swift @@ -24,7 +24,7 @@ class DataTableViewCell : BaseTableViewCell { @IBOutlet weak var dataText: UILabel! override func awakeFromNib() { - self.dataText?.font = UIFont.italicSystemFontOfSize(16) + self.dataText?.font = UIFont.italicSystemFont(ofSize: 16) self.dataText?.textColor = UIColor(hex: "9E9E9E") } @@ -32,7 +32,7 @@ class DataTableViewCell : BaseTableViewCell { return 80 } - override func setData(data: Any?) { + override func setData(_ data: Any?) { if let data = data as? DataTableViewCellData { self.dataImage.setRandomDownloadImage(80, height: 80) self.dataText.text = data.text diff --git a/SlideMenuControllerSwift/DataTableViewCell.xib b/SlideMenuControllerSwift/DataTableViewCell.xib index 381213c..9fd6634 100644 --- a/SlideMenuControllerSwift/DataTableViewCell.xib +++ b/SlideMenuControllerSwift/DataTableViewCell.xib @@ -1,8 +1,9 @@ - + - + + @@ -11,20 +12,16 @@ - + - - - @@ -42,8 +38,7 @@ - - + diff --git a/SlideMenuControllerSwift/ExSlideMenuController.swift b/SlideMenuControllerSwift/ExSlideMenuController.swift index b826d85..870822b 100644 --- a/SlideMenuControllerSwift/ExSlideMenuController.swift +++ b/SlideMenuControllerSwift/ExSlideMenuController.swift @@ -22,23 +22,23 @@ class ExSlideMenuController : SlideMenuController { return false } - override func track(trackAction: TrackAction) { + override func track(_ trackAction: TrackAction) { switch trackAction { - case .LeftTapOpen: + case .leftTapOpen: print("TrackAction: left tap open.") - case .LeftTapClose: + case .leftTapClose: print("TrackAction: left tap close.") - case .LeftFlickOpen: + case .leftFlickOpen: print("TrackAction: left flick open.") - case .LeftFlickClose: + case .leftFlickClose: print("TrackAction: left flick close.") - case .RightTapOpen: + case .rightTapOpen: print("TrackAction: right tap open.") - case .RightTapClose: + case .rightTapClose: print("TrackAction: right tap close.") - case .RightFlickOpen: + case .rightFlickOpen: print("TrackAction: right flick open.") - case .RightFlickClose: + case .rightFlickClose: print("TrackAction: right flick close.") } } diff --git a/SlideMenuControllerSwift/GoViewController.swift b/SlideMenuControllerSwift/GoViewController.swift index 0aab2ea..8bf5a95 100644 --- a/SlideMenuControllerSwift/GoViewController.swift +++ b/SlideMenuControllerSwift/GoViewController.swift @@ -14,8 +14,8 @@ class GoViewController: UIViewController { super.viewDidLoad() } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setNavigationBarItem() } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/ImageHeaderView.swift b/SlideMenuControllerSwift/ImageHeaderView.swift index 788308a..b2dc4d4 100644 --- a/SlideMenuControllerSwift/ImageHeaderView.swift +++ b/SlideMenuControllerSwift/ImageHeaderView.swift @@ -16,11 +16,12 @@ class ImageHeaderView : UIView { override func awakeFromNib() { super.awakeFromNib() self.backgroundColor = UIColor(hex: "E0E0E0") - self.profileImage.layer.cornerRadius = self.profileImage.frame.size.height / 2 + self.profileImage.layoutIfNeeded() + self.profileImage.layer.cornerRadius = self.profileImage.bounds.size.height / 2 self.profileImage.clipsToBounds = true self.profileImage.layer.borderWidth = 1 - self.profileImage.layer.borderColor = UIColor.whiteColor().CGColor + self.profileImage.layer.borderColor = UIColor.white.cgColor self.profileImage.setRandomDownloadImage(80, height: 80) - self.backgroundImage.setRandomDownloadImage(Int(self.frame.size.width), height: 160) + self.backgroundImage.setRandomDownloadImage(Int(self.bounds.size.width), height: 160) } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/ImageHeaderView.xib b/SlideMenuControllerSwift/ImageHeaderView.xib index 9d87004..45d0e07 100644 --- a/SlideMenuControllerSwift/ImageHeaderView.xib +++ b/SlideMenuControllerSwift/ImageHeaderView.xib @@ -1,8 +1,9 @@ - + - + + @@ -11,21 +12,15 @@ - - - - + - - - - + diff --git a/SlideMenuControllerSwift/Info.plist b/SlideMenuControllerSwift/Info.plist index 5da0369..fab810f 100644 --- a/SlideMenuControllerSwift/Info.plist +++ b/SlideMenuControllerSwift/Info.plist @@ -44,5 +44,16 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + NSAppTransportSecurity + + NSExceptionDomains + + lorempixel.com + + NSTemporaryExceptionAllowsInsecureHTTPLoads + + + + diff --git a/SlideMenuControllerSwift/JavaViewController.swift b/SlideMenuControllerSwift/JavaViewController.swift index 106107f..a80ec15 100644 --- a/SlideMenuControllerSwift/JavaViewController.swift +++ b/SlideMenuControllerSwift/JavaViewController.swift @@ -14,8 +14,8 @@ class JavaViewController: UIViewController { super.viewDidLoad() } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setNavigationBarItem() } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/LeftViewController.swift b/SlideMenuControllerSwift/LeftViewController.swift index e1cb7a4..ba71992 100644 --- a/SlideMenuControllerSwift/LeftViewController.swift +++ b/SlideMenuControllerSwift/LeftViewController.swift @@ -8,15 +8,15 @@ import UIKit enum LeftMenu: Int { - case Main = 0 - case Swift - case Java - case Go - case NonMenu + case main = 0 + case swift + case java + case go + case nonMenu } protocol LeftMenuProtocol : class { - func changeViewController(menu: LeftMenu) + func changeViewController(_ menu: LeftMenu) } class LeftViewController : UIViewController, LeftMenuProtocol { @@ -36,19 +36,20 @@ class LeftViewController : UIViewController, LeftMenuProtocol { override func viewDidLoad() { super.viewDidLoad() + self.tableView.separatorColor = UIColor(red: 224/255, green: 224/255, blue: 224/255, alpha: 1.0) let storyboard = UIStoryboard(name: "Main", bundle: nil) - let swiftViewController = storyboard.instantiateViewControllerWithIdentifier("SwiftViewController") as! SwiftViewController + let swiftViewController = storyboard.instantiateViewController(withIdentifier: "SwiftViewController") as! SwiftViewController self.swiftViewController = UINavigationController(rootViewController: swiftViewController) - let javaViewController = storyboard.instantiateViewControllerWithIdentifier("JavaViewController") as! JavaViewController + let javaViewController = storyboard.instantiateViewController(withIdentifier: "JavaViewController") as! JavaViewController self.javaViewController = UINavigationController(rootViewController: javaViewController) - let goViewController = storyboard.instantiateViewControllerWithIdentifier("GoViewController") as! GoViewController + let goViewController = storyboard.instantiateViewController(withIdentifier: "GoViewController") as! GoViewController self.goViewController = UINavigationController(rootViewController: goViewController) - let nonMenuController = storyboard.instantiateViewControllerWithIdentifier("NonMenuController") as! NonMenuController + let nonMenuController = storyboard.instantiateViewController(withIdentifier: "NonMenuController") as! NonMenuController nonMenuController.delegate = self self.nonMenuViewController = UINavigationController(rootViewController: nonMenuController) @@ -58,7 +59,7 @@ class LeftViewController : UIViewController, LeftMenuProtocol { self.view.addSubview(self.imageHeaderView) } - override func viewDidAppear(animated: Bool) { + override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) } @@ -68,46 +69,58 @@ class LeftViewController : UIViewController, LeftMenuProtocol { self.view.layoutIfNeeded() } - func changeViewController(menu: LeftMenu) { + func changeViewController(_ menu: LeftMenu) { switch menu { - case .Main: + case .main: self.slideMenuController()?.changeMainViewController(self.mainViewController, close: true) - case .Swift: + case .swift: self.slideMenuController()?.changeMainViewController(self.swiftViewController, close: true) - case .Java: + case .java: self.slideMenuController()?.changeMainViewController(self.javaViewController, close: true) - case .Go: + case .go: self.slideMenuController()?.changeMainViewController(self.goViewController, close: true) - case .NonMenu: + case .nonMenu: self.slideMenuController()?.changeMainViewController(self.nonMenuViewController, close: true) } } } extension LeftViewController : UITableViewDelegate { - func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - if let menu = LeftMenu(rawValue: indexPath.item) { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { + if let menu = LeftMenu(rawValue: indexPath.row) { switch menu { - case .Main, .Swift, .Java, .Go, .NonMenu: + case .main, .swift, .java, .go, .nonMenu: return BaseTableViewCell.height() } } return 0 } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if let menu = LeftMenu(rawValue: indexPath.row) { + self.changeViewController(menu) + } + } + + func scrollViewDidScroll(_ scrollView: UIScrollView) { + if self.tableView == scrollView { + + } + } } extension LeftViewController : UITableViewDataSource { - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return menus.count } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { - if let menu = LeftMenu(rawValue: indexPath.item) { + if let menu = LeftMenu(rawValue: indexPath.row) { switch menu { - case .Main, .Swift, .Java, .Go, .NonMenu: - let cell = BaseTableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: BaseTableViewCell.identifier) + case .main, .swift, .java, .go, .nonMenu: + let cell = BaseTableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: BaseTableViewCell.identifier) cell.setData(menus[indexPath.row]) return cell } @@ -115,19 +128,5 @@ extension LeftViewController : UITableViewDataSource { return UITableViewCell() } - func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - if let menu = LeftMenu(rawValue: indexPath.item) { - self.changeViewController(menu) - } - } -} - -extension LeftViewController: UIScrollViewDelegate { - - func scrollViewDidScroll(scrollView: UIScrollView) { - if self.tableView == scrollView { - - } - } } diff --git a/SlideMenuControllerSwift/MainViewController.swift b/SlideMenuControllerSwift/MainViewController.swift index 531dda8..6af1b65 100644 --- a/SlideMenuControllerSwift/MainViewController.swift +++ b/SlideMenuControllerSwift/MainViewController.swift @@ -18,11 +18,11 @@ class MainViewController: UIViewController { self.tableView.registerCellNib(DataTableViewCell.self) } - override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setNavigationBarItem() } @@ -35,28 +35,28 @@ class MainViewController: UIViewController { extension MainViewController : UITableViewDelegate { - func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { return DataTableViewCell.height() } + + func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let storyboard = UIStoryboard(name: "SubContentsViewController", bundle: nil) + let subContentsVC = storyboard.instantiateViewController(withIdentifier: "SubContentsViewController") as! SubContentsViewController + self.navigationController?.pushViewController(subContentsVC, animated: true) + } } extension MainViewController : UITableViewDataSource { - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.mainContens.count } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = self.tableView.dequeueReusableCellWithIdentifier(DataTableViewCell.identifier) as! DataTableViewCell + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = self.tableView.dequeueReusableCell(withIdentifier: DataTableViewCell.identifier) as! DataTableViewCell let data = DataTableViewCellData(imageUrl: "dummy", text: mainContens[indexPath.row]) cell.setData(data) return cell } - - func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - let storyboard = UIStoryboard(name: "SubContentsViewController", bundle: nil) - let subContentsVC = storyboard.instantiateViewControllerWithIdentifier("SubContentsViewController") as! SubContentsViewController - self.navigationController?.pushViewController(subContentsVC, animated: true) - } } extension MainViewController : SlideMenuControllerDelegate { diff --git a/SlideMenuControllerSwift/NonMenuController.swift b/SlideMenuControllerSwift/NonMenuController.swift index 20dd896..958d9c2 100644 --- a/SlideMenuControllerSwift/NonMenuController.swift +++ b/SlideMenuControllerSwift/NonMenuController.swift @@ -18,25 +18,25 @@ class NonMenuController: UIViewController { super.viewDidLoad() } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.removeNavigationBarItem() } - override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) - coordinator.animateAlongsideTransition(nil, completion: { (context: UIViewControllerTransitionCoordinatorContext!) -> Void in + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + coordinator.animate(alongsideTransition: nil, completion: { (context: UIViewControllerTransitionCoordinatorContext!) -> Void in guard let vc = (self.slideMenuController()?.mainViewController as? UINavigationController)?.topViewController else { return } - if vc.isKindOfClass(NonMenuController) { + if vc.isKind(of: NonMenuController.self) { self.slideMenuController()?.removeLeftGestures() self.slideMenuController()?.removeRightGestures() } }) } - @IBAction func didTouchToMain(sender: UIButton) { - delegate?.changeViewController(LeftMenu.Main) + @IBAction func didTouchToMain(_ sender: UIButton) { + delegate?.changeViewController(LeftMenu.main) } } diff --git a/SlideMenuControllerSwift/String.swift b/SlideMenuControllerSwift/String.swift index a9ef7ee..61e4045 100644 --- a/SlideMenuControllerSwift/String.swift +++ b/SlideMenuControllerSwift/String.swift @@ -9,15 +9,15 @@ import Foundation extension String { - static func className(aClass: AnyClass) -> String { - return NSStringFromClass(aClass).componentsSeparatedByString(".").last! + static func className(_ aClass: AnyClass) -> String { + return NSStringFromClass(aClass).components(separatedBy: ".").last! } - func substring(from: Int) -> String { - return self.substringFromIndex(self.startIndex.advancedBy(from)) + func substring(_ from: Int) -> String { + return self.substring(from: self.characters.index(self.startIndex, offsetBy: from)) } var length: Int { return self.characters.count } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/SubContentsViewController.storyboard b/SlideMenuControllerSwift/SubContentsViewController.storyboard index e0e55c0..57264da 100644 --- a/SlideMenuControllerSwift/SubContentsViewController.storyboard +++ b/SlideMenuControllerSwift/SubContentsViewController.storyboard @@ -1,8 +1,9 @@ - + - + + @@ -18,24 +19,23 @@ - - + + + diff --git a/SlideMenuControllerSwift/SwiftViewController.swift b/SlideMenuControllerSwift/SwiftViewController.swift index 265a932..4fc910f 100644 --- a/SlideMenuControllerSwift/SwiftViewController.swift +++ b/SlideMenuControllerSwift/SwiftViewController.swift @@ -16,9 +16,9 @@ class SwiftViewController: UIViewController { super.viewDidLoad() } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.setNavigationBarItem() } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/UIApplication.swift b/SlideMenuControllerSwift/UIApplication.swift index 3653f75..798b294 100644 --- a/SlideMenuControllerSwift/UIApplication.swift +++ b/SlideMenuControllerSwift/UIApplication.swift @@ -9,7 +9,7 @@ import UIKit extension UIApplication { - class func topViewController(viewController: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? { + class func topViewController(_ viewController: UIViewController? = UIApplication.shared.keyWindow?.rootViewController) -> UIViewController? { if let nav = viewController as? UINavigationController { return topViewController(nav.visibleViewController) } diff --git a/SlideMenuControllerSwift/UIColor.swift b/SlideMenuControllerSwift/UIColor.swift index 999a5de..f73260f 100644 --- a/SlideMenuControllerSwift/UIColor.swift +++ b/SlideMenuControllerSwift/UIColor.swift @@ -20,9 +20,9 @@ extension UIColor { hexWithoutSymbol = hex.substring(1) } - let scanner = NSScanner(string: hexWithoutSymbol) + let scanner = Scanner(string: hexWithoutSymbol) var hexInt:UInt32 = 0x0 - scanner.scanHexInt(&hexInt) + scanner.scanHexInt32(&hexInt) var r:UInt32!, g:UInt32!, b:UInt32! switch (hexWithoutSymbol.length) { diff --git a/SlideMenuControllerSwift/UIImage.swift b/SlideMenuControllerSwift/UIImage.swift index 57d8cbd..669f7a5 100644 --- a/SlideMenuControllerSwift/UIImage.swift +++ b/SlideMenuControllerSwift/UIImage.swift @@ -9,15 +9,15 @@ import UIKit extension UIImage { - func trim(trimRect trimRect :CGRect) -> UIImage { - if CGRectContainsRect(CGRect(origin: CGPointZero, size: self.size), trimRect) { - if let imageRef = CGImageCreateWithImageInRect(self.CGImage, trimRect) { - return UIImage(CGImage: imageRef) + func trim(trimRect :CGRect) -> UIImage { + if CGRect(origin: CGPoint.zero, size: self.size).contains(trimRect) { + if let imageRef = self.cgImage?.cropping(to: trimRect) { + return UIImage(cgImage: imageRef) } } UIGraphicsBeginImageContextWithOptions(trimRect.size, true, self.scale) - self.drawInRect(CGRect(x: -trimRect.minX, y: -trimRect.minY, width: self.size.width, height: self.size.height)) + self.draw(in: CGRect(x: -trimRect.minX, y: -trimRect.minY, width: self.size.width, height: self.size.height)) let trimmedImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() @@ -25,4 +25,4 @@ extension UIImage { return image } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/UIImageView.swift b/SlideMenuControllerSwift/UIImageView.swift index 4d89070..e27f673 100644 --- a/SlideMenuControllerSwift/UIImageView.swift +++ b/SlideMenuControllerSwift/UIImageView.swift @@ -11,42 +11,42 @@ import UIKit extension UIImageView { - func setRandomDownloadImage(width: Int, height: Int) { + func setRandomDownloadImage(_ width: Int, height: Int) { if self.image != nil { self.alpha = 1 return } self.alpha = 0 - let url = NSURL(string: "https://ssl.webpack.de/lorempixel.com/\(width)/\(height)/")! - let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() + let url = URL(string: "http://lorempixel.com/\(width)/\(height)/")! + let configuration = URLSessionConfiguration.default configuration.timeoutIntervalForRequest = 15 configuration.timeoutIntervalForResource = 15 - configuration.requestCachePolicy = NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData - let session = NSURLSession(configuration: configuration) - let task = session.dataTaskWithURL(url, completionHandler: { (data: NSData?, response: NSURLResponse?, error: NSError?) -> Void in + configuration.requestCachePolicy = NSURLRequest.CachePolicy.reloadIgnoringLocalCacheData + let session = URLSession(configuration: configuration) + let task = session.dataTask(with: url) { (data, response, error) in if error != nil { return } - if let response = response as? NSHTTPURLResponse { + if let response = response as? HTTPURLResponse { if response.statusCode / 100 != 2 { return } if let data = data, let image = UIImage(data: data) { - dispatch_async(dispatch_get_main_queue(), { () -> Void in + DispatchQueue.main.async(execute: { () -> Void in self.image = image - UIView.animateWithDuration(0.3, animations: { () -> Void in + UIView.animate(withDuration: 0.3, animations: { () -> Void in self.alpha = 1 - }) { (finished: Bool) -> Void in - } + }, completion: { (finished: Bool) -> Void in + }) }) } } - }) + } task.resume() } - func clipParallaxEffect(baseImage: UIImage?, screenSize: CGSize, displayHeight: CGFloat) { + func clipParallaxEffect(_ baseImage: UIImage?, screenSize: CGSize, displayHeight: CGFloat) { if let baseImage = baseImage { if displayHeight < 0 { return @@ -61,9 +61,9 @@ extension UIImageView { let left: CGFloat = (imageSize.width - cropWidth) / 2 let top: CGFloat = (imageSize.height - cropHeight) / 2 - let trimRect : CGRect = CGRectMake(left, top, cropWidth, cropHeight) + let trimRect : CGRect = CGRect(x: left, y: top, width: cropWidth, height: cropHeight) self.image = baseImage.trim(trimRect: trimRect) - self.frame = CGRectMake(0, 0, screenSize.width, displayHeight) + self.frame = CGRect(x: 0, y: 0, width: screenSize.width, height: displayHeight) } } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/UITableViewExtension.swift b/SlideMenuControllerSwift/UITableViewExtension.swift index ba71917..48ca05a 100644 --- a/SlideMenuControllerSwift/UITableViewExtension.swift +++ b/SlideMenuControllerSwift/UITableViewExtension.swift @@ -9,25 +9,25 @@ import UIKit public extension UITableView { - func registerCellClass(cellClass: AnyClass) { + func registerCellClass(_ cellClass: AnyClass) { let identifier = String.className(cellClass) - self.registerClass(cellClass, forCellReuseIdentifier: identifier) + self.register(cellClass, forCellReuseIdentifier: identifier) } - func registerCellNib(cellClass: AnyClass) { + func registerCellNib(_ cellClass: AnyClass) { let identifier = String.className(cellClass) let nib = UINib(nibName: identifier, bundle: nil) - self.registerNib(nib, forCellReuseIdentifier: identifier) + self.register(nib, forCellReuseIdentifier: identifier) } - func registerHeaderFooterViewClass(viewClass: AnyClass) { + func registerHeaderFooterViewClass(_ viewClass: AnyClass) { let identifier = String.className(viewClass) - self.registerClass(viewClass, forHeaderFooterViewReuseIdentifier: identifier) + self.register(viewClass, forHeaderFooterViewReuseIdentifier: identifier) } - func registerHeaderFooterViewNib(viewClass: AnyClass) { + func registerHeaderFooterViewNib(_ viewClass: AnyClass) { let identifier = String.className(viewClass) let nib = UINib(nibName: identifier, bundle: nil) - self.registerNib(nib, forHeaderFooterViewReuseIdentifier: identifier) + self.register(nib, forHeaderFooterViewReuseIdentifier: identifier) } -} \ No newline at end of file +} diff --git a/SlideMenuControllerSwift/UIView.swift b/SlideMenuControllerSwift/UIView.swift index 918abc2..9fc4d28 100644 --- a/SlideMenuControllerSwift/UIView.swift +++ b/SlideMenuControllerSwift/UIView.swift @@ -9,9 +9,9 @@ import UIKit extension UIView { - class func loadNib(viewType: T.Type) -> T { + class func loadNib(_ viewType: T.Type) -> T { let className = String.className(viewType) - return NSBundle(forClass: viewType).loadNibNamed(className, owner: nil, options: nil).first as! T + return Bundle(for: viewType).loadNibNamed(className, owner: nil, options: nil)!.first as! T } class func loadNib() -> Self { diff --git a/SlideMenuControllerSwiftTests/SlideMenuControllerSwiftTests.swift b/SlideMenuControllerSwiftTests/SlideMenuControllerSwiftTests.swift index 3aaab61..bc14ff9 100644 --- a/SlideMenuControllerSwiftTests/SlideMenuControllerSwiftTests.swift +++ b/SlideMenuControllerSwiftTests/SlideMenuControllerSwiftTests.swift @@ -27,7 +27,7 @@ class SlideMenuControllerSwiftTests: XCTestCase { func testPerformanceExample() { // This is an example of a performance test case. - self.measureBlock() { + self.measure() { // Put the code you want to measure the time of here. } } diff --git a/Source/SlideMenuController.swift b/Source/SlideMenuController.swift index 272fbd5..08bc88c 100644 --- a/Source/SlideMenuController.swift +++ b/Source/SlideMenuController.swift @@ -8,14 +8,14 @@ import Foundation import UIKit @objc public protocol SlideMenuControllerDelegate { - optional func leftWillOpen() - optional func leftDidOpen() - optional func leftWillClose() - optional func leftDidClose() - optional func rightWillOpen() - optional func rightDidOpen() - optional func rightWillClose() - optional func rightDidClose() + @objc optional func leftWillOpen() + @objc optional func leftDidOpen() + @objc optional func leftWillClose() + @objc optional func leftDidClose() + @objc optional func rightWillOpen() + @objc optional func rightDidOpen() + @objc optional func rightWillClose() + @objc optional func rightDidClose() } public struct SlideMenuOptions { @@ -26,34 +26,37 @@ public struct SlideMenuOptions { public static var contentViewDrag: Bool = false public static var shadowOpacity: CGFloat = 0.0 public static var shadowRadius: CGFloat = 0.0 - public static var shadowOffset: CGSize = CGSizeMake(0,0) + public static var shadowOffset: CGSize = CGSize(width: 0,height: 0) public static var panFromBezel: Bool = true public static var animationDuration: CGFloat = 0.4 + public static var animationOptions: UIViewAnimationOptions = [] public static var rightViewWidth: CGFloat = 270.0 public static var rightBezelWidth: CGFloat? = 16.0 public static var rightPanFromBezel: Bool = true public static var hideStatusBar: Bool = true public static var pointOfNoReturnWidth: CGFloat = 44.0 public static var simultaneousGestureRecognizers: Bool = true - public static var opacityViewBackgroundColor: UIColor = UIColor.blackColor() + public static var opacityViewBackgroundColor: UIColor = UIColor.black + public static var panGesturesEnabled: Bool = true + public static var tapGesturesEnabled: Bool = true } -public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate { +open class SlideMenuController: UIViewController, UIGestureRecognizerDelegate { public enum SlideAction { - case Open - case Close + case open + case close } public enum TrackAction { - case LeftTapOpen - case LeftTapClose - case LeftFlickOpen - case LeftFlickClose - case RightTapOpen - case RightTapClose - case RightFlickOpen - case RightFlickClose + case leftTapOpen + case leftTapClose + case leftFlickOpen + case leftFlickClose + case rightTapOpen + case rightTapClose + case rightFlickOpen + case rightFlickClose } @@ -63,25 +66,25 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate var velocity: CGFloat } - public weak var delegate: SlideMenuControllerDelegate? + open weak var delegate: SlideMenuControllerDelegate? - public var opacityView = UIView() - public var mainContainerView = UIView() - public var leftContainerView = UIView() - public var rightContainerView = UIView() - public var mainViewController: UIViewController? - public var leftViewController: UIViewController? - public var leftPanGesture: UIPanGestureRecognizer? - public var leftTapGesture: UITapGestureRecognizer? - public var rightViewController: UIViewController? - public var rightPanGesture: UIPanGestureRecognizer? - public var rightTapGesture: UITapGestureRecognizer? + open var opacityView = UIView() + open var mainContainerView = UIView() + open var leftContainerView = UIView() + open var rightContainerView = UIView() + open var mainViewController: UIViewController? + open var leftViewController: UIViewController? + open var leftPanGesture: UIPanGestureRecognizer? + open var leftTapGesture: UITapGestureRecognizer? + open var rightViewController: UIViewController? + open var rightPanGesture: UIPanGestureRecognizer? + open var rightTapGesture: UITapGestureRecognizer? public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } - public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { + public override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) { super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) } @@ -107,17 +110,17 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate initView() } - public override func awakeFromNib() { + open override func awakeFromNib() { initView() } deinit { } - public func initView() { + open func initView() { mainContainerView = UIView(frame: view.bounds) - mainContainerView.backgroundColor = UIColor.clearColor() - mainContainerView.autoresizingMask = [.FlexibleHeight, .FlexibleWidth] - view.insertSubview(mainContainerView, atIndex: 0) + mainContainerView.backgroundColor = UIColor.clear + mainContainerView.autoresizingMask = [.flexibleHeight, .flexibleWidth] + view.insertSubview(mainContainerView, at: 0) var opacityframe: CGRect = view.bounds let opacityOffset: CGFloat = 0 @@ -125,21 +128,21 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate opacityframe.size.height = opacityframe.size.height - opacityOffset opacityView = UIView(frame: opacityframe) opacityView.backgroundColor = SlideMenuOptions.opacityViewBackgroundColor - opacityView.autoresizingMask = [UIViewAutoresizing.FlexibleHeight, UIViewAutoresizing.FlexibleWidth] + opacityView.autoresizingMask = [UIViewAutoresizing.flexibleHeight, UIViewAutoresizing.flexibleWidth] opacityView.layer.opacity = 0.0 - view.insertSubview(opacityView, atIndex: 1) + view.insertSubview(opacityView, at: 1) if leftViewController != nil { var leftFrame: CGRect = view.bounds leftFrame.size.width = SlideMenuOptions.leftViewWidth - leftFrame.origin.x = leftMinOrigin(); + leftFrame.origin.x = leftMinOrigin() let leftOffset: CGFloat = 0 leftFrame.origin.y = leftFrame.origin.y + leftOffset leftFrame.size.height = leftFrame.size.height - leftOffset leftContainerView = UIView(frame: leftFrame) - leftContainerView.backgroundColor = UIColor.clearColor() - leftContainerView.autoresizingMask = UIViewAutoresizing.FlexibleHeight - view.insertSubview(leftContainerView, atIndex: 2) + leftContainerView.backgroundColor = UIColor.clear + leftContainerView.autoresizingMask = UIViewAutoresizing.flexibleHeight + view.insertSubview(leftContainerView, at: 2) addLeftGestures() } @@ -148,27 +151,27 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate rightFrame.size.width = SlideMenuOptions.rightViewWidth rightFrame.origin.x = rightMinOrigin() let rightOffset: CGFloat = 0 - rightFrame.origin.y = rightFrame.origin.y + rightOffset; + rightFrame.origin.y = rightFrame.origin.y + rightOffset rightFrame.size.height = rightFrame.size.height - rightOffset rightContainerView = UIView(frame: rightFrame) - rightContainerView.backgroundColor = UIColor.clearColor() - rightContainerView.autoresizingMask = UIViewAutoresizing.FlexibleHeight - view.insertSubview(rightContainerView, atIndex: 3) + rightContainerView.backgroundColor = UIColor.clear + rightContainerView.autoresizingMask = UIViewAutoresizing.flexibleHeight + view.insertSubview(rightContainerView, at: 3) addRightGestures() } } - public override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { - super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) - mainContainerView.transform = CGAffineTransformMakeScale(1.0, 1.0) - leftContainerView.hidden = true - rightContainerView.hidden = true + open override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { + super.viewWillTransition(to: size, with: coordinator) + mainContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) + leftContainerView.isHidden = true + rightContainerView.isHidden = true - coordinator.animateAlongsideTransition(nil, completion: { (context: UIViewControllerTransitionCoordinatorContext!) -> Void in + coordinator.animate(alongsideTransition: nil, completion: { (context: UIViewControllerTransitionCoordinatorContext!) -> Void in self.closeLeftNonAnimation() self.closeRightNonAnimation() - self.leftContainerView.hidden = false - self.rightContainerView.hidden = false + self.leftContainerView.isHidden = false + self.rightContainerView.isHidden = false if self.leftPanGesture != nil && self.leftPanGesture != nil { self.removeLeftGestures() @@ -182,30 +185,40 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate }) } - public override func viewDidLoad() { + open override func viewDidLoad() { super.viewDidLoad() - edgesForExtendedLayout = UIRectEdge.None + edgesForExtendedLayout = UIRectEdge() + } + + override open func viewWillAppear(_ animated: Bool) { + super.viewWillAppear(animated) + //automatically called + //self.mainViewController?.viewWillAppear(animated) } - public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask { + open override var supportedInterfaceOrientations : UIInterfaceOrientationMask { if let mainController = self.mainViewController{ - return mainController.supportedInterfaceOrientations() + return mainController.supportedInterfaceOrientations } - return UIInterfaceOrientationMask.All + return UIInterfaceOrientationMask.all } - public override func shouldAutorotate() -> Bool { - return mainViewController?.shouldAutorotate() ?? false + open override var shouldAutorotate : Bool { + return mainViewController?.shouldAutorotate ?? false } - public override func viewWillLayoutSubviews() { + open override func viewWillLayoutSubviews() { // topLayoutGuideの値が確定するこのタイミングで各種ViewControllerをセットする setUpViewController(mainContainerView, targetViewController: mainViewController) setUpViewController(leftContainerView, targetViewController: leftViewController) setUpViewController(rightContainerView, targetViewController: rightViewController) } - public override func openLeft() { + open override var preferredStatusBarStyle: UIStatusBarStyle { + return self.mainViewController?.preferredStatusBarStyle ?? .default + } + + open override func openLeft() { guard let _ = leftViewController else { // If leftViewController is nil, then return return } @@ -217,10 +230,10 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate leftViewController?.beginAppearanceTransition(isLeftHidden(), animated: true) openLeftWithVelocity(0.0) - track(.LeftTapOpen) + track(.leftTapOpen) } - public override func openRight() { + open override func openRight() { guard let _ = rightViewController else { // If rightViewController is nil, then return return } @@ -231,10 +244,10 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate rightViewController?.beginAppearanceTransition(isRightHidden(), animated: true) openRightWithVelocity(0.0) - track(.RightTapOpen) + track(.rightTapOpen) } - public override func closeLeft() { + open override func closeLeft() { guard let _ = leftViewController else { // If leftViewController is nil, then return return } @@ -246,7 +259,7 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate setCloseWindowLevel() } - public override func closeRight() { + open override func closeRight() { guard let _ = rightViewController else { // If rightViewController is nil, then return return } @@ -259,41 +272,49 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } - public func addLeftGestures() { + open func addLeftGestures() { - if (leftViewController != nil) { - if leftPanGesture == nil { - leftPanGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handleLeftPanGesture(_:))) - leftPanGesture!.delegate = self - view.addGestureRecognizer(leftPanGesture!) + if leftViewController != nil { + if SlideMenuOptions.panGesturesEnabled { + if leftPanGesture == nil { + leftPanGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handleLeftPanGesture(_:))) + leftPanGesture!.delegate = self + view.addGestureRecognizer(leftPanGesture!) + } } - if leftTapGesture == nil { - leftTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.toggleLeft)) - leftTapGesture!.delegate = self - view.addGestureRecognizer(leftTapGesture!) + if SlideMenuOptions.tapGesturesEnabled { + if leftTapGesture == nil { + leftTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.toggleLeft)) + leftTapGesture!.delegate = self + view.addGestureRecognizer(leftTapGesture!) + } } } } - public func addRightGestures() { + open func addRightGestures() { - if (rightViewController != nil) { - if rightPanGesture == nil { - rightPanGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handleRightPanGesture(_:))) - rightPanGesture!.delegate = self - view.addGestureRecognizer(rightPanGesture!) + if rightViewController != nil { + if SlideMenuOptions.panGesturesEnabled { + if rightPanGesture == nil { + rightPanGesture = UIPanGestureRecognizer(target: self, action: #selector(self.handleRightPanGesture(_:))) + rightPanGesture!.delegate = self + view.addGestureRecognizer(rightPanGesture!) + } } - if rightTapGesture == nil { - rightTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.toggleRight)) - rightTapGesture!.delegate = self - view.addGestureRecognizer(rightTapGesture!) + if SlideMenuOptions.tapGesturesEnabled { + if rightTapGesture == nil { + rightTapGesture = UITapGestureRecognizer(target: self, action: #selector(self.toggleRight)) + rightTapGesture!.delegate = self + view.addGestureRecognizer(rightTapGesture!) + } } } } - public func removeLeftGestures() { + open func removeLeftGestures() { if leftPanGesture != nil { view.removeGestureRecognizer(leftPanGesture!) @@ -306,7 +327,7 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } } - public func removeRightGestures() { + open func removeRightGestures() { if rightPanGesture != nil { view.removeGestureRecognizer(rightPanGesture!) @@ -319,26 +340,26 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } } - public func isTagetViewController() -> Bool { + open func isTagetViewController() -> Bool { // Function to determine the target ViewController // Please to override it if necessary return true } - public func track(trackAction: TrackAction) { + open func track(_ trackAction: TrackAction) { // function is for tracking // Please to override it if necessary } struct LeftPanState { - static var frameAtStartOfPan: CGRect = CGRectZero - static var startPointOfPan: CGPoint = CGPointZero + static var frameAtStartOfPan: CGRect = CGRect.zero + static var startPointOfPan: CGPoint = CGPoint.zero static var wasOpenAtStartOfPan: Bool = false static var wasHiddenAtStartOfPan: Bool = false - static var lastState : UIGestureRecognizerState = .Ended + static var lastState : UIGestureRecognizerState = .ended } - func handleLeftPanGesture(panGesture: UIPanGestureRecognizer) { + @objc func handleLeftPanGesture(_ panGesture: UIPanGestureRecognizer) { if !isTagetViewController() { return @@ -349,8 +370,8 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } switch panGesture.state { - case UIGestureRecognizerState.Began: - if LeftPanState.lastState != .Ended && LeftPanState.lastState != .Cancelled && LeftPanState.lastState != .Failed { + case UIGestureRecognizerState.began: + if LeftPanState.lastState != .ended && LeftPanState.lastState != .cancelled && LeftPanState.lastState != .failed { return } @@ -361,38 +382,38 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } LeftPanState.frameAtStartOfPan = leftContainerView.frame - LeftPanState.startPointOfPan = panGesture.locationInView(view) + LeftPanState.startPointOfPan = panGesture.location(in: view) LeftPanState.wasOpenAtStartOfPan = isLeftOpen() LeftPanState.wasHiddenAtStartOfPan = isLeftHidden() leftViewController?.beginAppearanceTransition(LeftPanState.wasHiddenAtStartOfPan, animated: true) addShadowToView(leftContainerView) setOpenWindowLevel() - case UIGestureRecognizerState.Changed: - if LeftPanState.lastState != .Began && LeftPanState.lastState != .Changed { + case UIGestureRecognizerState.changed: + if LeftPanState.lastState != .began && LeftPanState.lastState != .changed { return } - let translation: CGPoint = panGesture.translationInView(panGesture.view!) + let translation: CGPoint = panGesture.translation(in: panGesture.view!) leftContainerView.frame = applyLeftTranslation(translation, toFrame: LeftPanState.frameAtStartOfPan) applyLeftOpacity() applyLeftContentViewScale() - case UIGestureRecognizerState.Ended, UIGestureRecognizerState.Cancelled: - if LeftPanState.lastState != .Changed { + case UIGestureRecognizerState.ended, UIGestureRecognizerState.cancelled: + if LeftPanState.lastState != .changed { setCloseWindowLevel() return } - let velocity:CGPoint = panGesture.velocityInView(panGesture.view) + let velocity:CGPoint = panGesture.velocity(in: panGesture.view) let panInfo: PanInfo = panLeftResultInfoForVelocity(velocity) - if panInfo.action == .Open { + if panInfo.action == .open { if !LeftPanState.wasHiddenAtStartOfPan { leftViewController?.beginAppearanceTransition(true, animated: true) } openLeftWithVelocity(panInfo.velocity) - track(.LeftFlickOpen) + track(.leftFlickOpen) } else { if LeftPanState.wasHiddenAtStartOfPan { leftViewController?.beginAppearanceTransition(false, animated: true) @@ -400,10 +421,10 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate closeLeftWithVelocity(panInfo.velocity) setCloseWindowLevel() - track(.LeftFlickClose) + track(.leftFlickClose) } - case UIGestureRecognizerState.Failed, UIGestureRecognizerState.Possible: + case UIGestureRecognizerState.failed, UIGestureRecognizerState.possible: break } @@ -411,14 +432,14 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } struct RightPanState { - static var frameAtStartOfPan: CGRect = CGRectZero - static var startPointOfPan: CGPoint = CGPointZero + static var frameAtStartOfPan: CGRect = CGRect.zero + static var startPointOfPan: CGPoint = CGPoint.zero static var wasOpenAtStartOfPan: Bool = false static var wasHiddenAtStartOfPan: Bool = false - static var lastState : UIGestureRecognizerState = .Ended + static var lastState : UIGestureRecognizerState = .ended } - func handleRightPanGesture(panGesture: UIPanGestureRecognizer) { + @objc func handleRightPanGesture(_ panGesture: UIPanGestureRecognizer) { if !isTagetViewController() { return @@ -429,8 +450,8 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } switch panGesture.state { - case UIGestureRecognizerState.Began: - if RightPanState.lastState != .Ended && RightPanState.lastState != .Cancelled && RightPanState.lastState != .Failed { + case UIGestureRecognizerState.began: + if RightPanState.lastState != .ended && RightPanState.lastState != .cancelled && RightPanState.lastState != .failed { return } @@ -441,7 +462,7 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } RightPanState.frameAtStartOfPan = rightContainerView.frame - RightPanState.startPointOfPan = panGesture.locationInView(view) + RightPanState.startPointOfPan = panGesture.location(in: view) RightPanState.wasOpenAtStartOfPan = isRightOpen() RightPanState.wasHiddenAtStartOfPan = isRightHidden() @@ -449,32 +470,32 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate addShadowToView(rightContainerView) setOpenWindowLevel() - case UIGestureRecognizerState.Changed: - if RightPanState.lastState != .Began && RightPanState.lastState != .Changed { + case UIGestureRecognizerState.changed: + if RightPanState.lastState != .began && RightPanState.lastState != .changed { return } - let translation: CGPoint = panGesture.translationInView(panGesture.view!) + let translation: CGPoint = panGesture.translation(in: panGesture.view!) rightContainerView.frame = applyRightTranslation(translation, toFrame: RightPanState.frameAtStartOfPan) applyRightOpacity() applyRightContentViewScale() - case UIGestureRecognizerState.Ended, UIGestureRecognizerState.Cancelled: - if RightPanState.lastState != .Changed { + case UIGestureRecognizerState.ended, UIGestureRecognizerState.cancelled: + if RightPanState.lastState != .changed { setCloseWindowLevel() return } - let velocity: CGPoint = panGesture.velocityInView(panGesture.view) + let velocity: CGPoint = panGesture.velocity(in: panGesture.view) let panInfo: PanInfo = panRightResultInfoForVelocity(velocity) - if panInfo.action == .Open { + if panInfo.action == .open { if !RightPanState.wasHiddenAtStartOfPan { rightViewController?.beginAppearanceTransition(true, animated: true) } openRightWithVelocity(panInfo.velocity) - track(.RightFlickOpen) + track(.rightFlickOpen) } else { if RightPanState.wasHiddenAtStartOfPan { rightViewController?.beginAppearanceTransition(false, animated: true) @@ -482,23 +503,23 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate closeRightWithVelocity(panInfo.velocity) setCloseWindowLevel() - track(.RightFlickClose) + track(.rightFlickClose) } - case UIGestureRecognizerState.Failed, UIGestureRecognizerState.Possible: + case UIGestureRecognizerState.failed, UIGestureRecognizerState.possible: break } RightPanState.lastState = panGesture.state } - public func openLeftWithVelocity(velocity: CGFloat) { + open func openLeftWithVelocity(_ velocity: CGFloat) { let xOrigin: CGFloat = leftContainerView.frame.origin.x let finalXOrigin: CGFloat = 0.0 - var frame = leftContainerView.frame; - frame.origin.x = finalXOrigin; + var frame = leftContainerView.frame + frame.origin.x = finalXOrigin - var duration: NSTimeInterval = Double(SlideMenuOptions.animationDuration) + var duration: TimeInterval = Double(SlideMenuOptions.animationDuration) if velocity != 0.0 { duration = Double(fabs(xOrigin - finalXOrigin) / velocity) duration = Double(fmax(0.1, fmin(1.0, duration))) @@ -506,12 +527,12 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate addShadowToView(leftContainerView) - UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { [weak self]() -> Void in + UIView.animate(withDuration: duration, delay: 0.0, options: SlideMenuOptions.animationOptions, animations: { [weak self]() -> Void in if let strongSelf = self { strongSelf.leftContainerView.frame = frame strongSelf.opacityView.layer.opacity = Float(SlideMenuOptions.contentViewOpacity) - SlideMenuOptions.contentViewDrag == true ? (strongSelf.mainContainerView.transform = CGAffineTransformMakeTranslation(SlideMenuOptions.leftViewWidth, 0)) : (strongSelf.mainContainerView.transform = CGAffineTransformMakeScale(SlideMenuOptions.contentViewScale, SlideMenuOptions.contentViewScale)) + SlideMenuOptions.contentViewDrag == true ? (strongSelf.mainContainerView.transform = CGAffineTransform(translationX: SlideMenuOptions.leftViewWidth, y: 0)) : (strongSelf.mainContainerView.transform = CGAffineTransform(scaleX: SlideMenuOptions.contentViewScale, y: SlideMenuOptions.contentViewScale)) } }) { [weak self](Bool) -> Void in @@ -523,29 +544,29 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } } - public func openRightWithVelocity(velocity: CGFloat) { + open func openRightWithVelocity(_ velocity: CGFloat) { let xOrigin: CGFloat = rightContainerView.frame.origin.x - // CGFloat finalXOrigin = SlideMenuOptions.rightViewOverlapWidth; - let finalXOrigin: CGFloat = CGRectGetWidth(view.bounds) - rightContainerView.frame.size.width + // CGFloat finalXOrigin = SlideMenuOptions.rightViewOverlapWidth + let finalXOrigin: CGFloat = view.bounds.width - rightContainerView.frame.size.width var frame = rightContainerView.frame frame.origin.x = finalXOrigin - var duration: NSTimeInterval = Double(SlideMenuOptions.animationDuration) + var duration: TimeInterval = Double(SlideMenuOptions.animationDuration) if velocity != 0.0 { - duration = Double(fabs(xOrigin - CGRectGetWidth(view.bounds)) / velocity) + duration = Double(fabs(xOrigin - view.bounds.width) / velocity) duration = Double(fmax(0.1, fmin(1.0, duration))) } addShadowToView(rightContainerView) - UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { [weak self]() -> Void in + UIView.animate(withDuration: duration, delay: 0.0, options: SlideMenuOptions.animationOptions, animations: { [weak self]() -> Void in if let strongSelf = self { strongSelf.rightContainerView.frame = frame strongSelf.opacityView.layer.opacity = Float(SlideMenuOptions.contentViewOpacity) - SlideMenuOptions.contentViewDrag == true ? (strongSelf.mainContainerView.transform = CGAffineTransformMakeTranslation(-SlideMenuOptions.rightViewWidth, 0)) : (strongSelf.mainContainerView.transform = CGAffineTransformMakeScale(SlideMenuOptions.contentViewScale, SlideMenuOptions.contentViewScale)) + SlideMenuOptions.contentViewDrag == true ? (strongSelf.mainContainerView.transform = CGAffineTransform(translationX: -SlideMenuOptions.rightViewWidth, y: 0)) : (strongSelf.mainContainerView.transform = CGAffineTransform(scaleX: SlideMenuOptions.contentViewScale, y: SlideMenuOptions.contentViewScale)) } }) { [weak self](Bool) -> Void in if let strongSelf = self { @@ -556,25 +577,25 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } } - public func closeLeftWithVelocity(velocity: CGFloat) { + open func closeLeftWithVelocity(_ velocity: CGFloat) { let xOrigin: CGFloat = leftContainerView.frame.origin.x let finalXOrigin: CGFloat = leftMinOrigin() - var frame: CGRect = leftContainerView.frame; + var frame: CGRect = leftContainerView.frame frame.origin.x = finalXOrigin - var duration: NSTimeInterval = Double(SlideMenuOptions.animationDuration) + var duration: TimeInterval = Double(SlideMenuOptions.animationDuration) if velocity != 0.0 { duration = Double(fabs(xOrigin - finalXOrigin) / velocity) duration = Double(fmax(0.1, fmin(1.0, duration))) } - UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { [weak self]() -> Void in + UIView.animate(withDuration: duration, delay: 0.0, options: SlideMenuOptions.animationOptions, animations: { [weak self]() -> Void in if let strongSelf = self { strongSelf.leftContainerView.frame = frame strongSelf.opacityView.layer.opacity = 0.0 - strongSelf.mainContainerView.transform = CGAffineTransformMakeScale(1.0, 1.0) + strongSelf.mainContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) } }) { [weak self](Bool) -> Void in if let strongSelf = self { @@ -587,25 +608,25 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } - public func closeRightWithVelocity(velocity: CGFloat) { + open func closeRightWithVelocity(_ velocity: CGFloat) { let xOrigin: CGFloat = rightContainerView.frame.origin.x - let finalXOrigin: CGFloat = CGRectGetWidth(view.bounds) + let finalXOrigin: CGFloat = view.bounds.width var frame: CGRect = rightContainerView.frame frame.origin.x = finalXOrigin - var duration: NSTimeInterval = Double(SlideMenuOptions.animationDuration) + var duration: TimeInterval = Double(SlideMenuOptions.animationDuration) if velocity != 0.0 { - duration = Double(fabs(xOrigin - CGRectGetWidth(view.bounds)) / velocity) + duration = Double(fabs(xOrigin - view.bounds.width) / velocity) duration = Double(fmax(0.1, fmin(1.0, duration))) } - UIView.animateWithDuration(duration, delay: 0.0, options: UIViewAnimationOptions.CurveEaseInOut, animations: { [weak self]() -> Void in + UIView.animate(withDuration: duration, delay: 0.0, options: SlideMenuOptions.animationOptions, animations: { [weak self]() -> Void in if let strongSelf = self { strongSelf.rightContainerView.frame = frame strongSelf.opacityView.layer.opacity = 0.0 - strongSelf.mainContainerView.transform = CGAffineTransformMakeScale(1.0, 1.0) + strongSelf.mainContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) } }) { [weak self](Bool) -> Void in if let strongSelf = self { @@ -618,82 +639,82 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } - public override func toggleLeft() { + open override func toggleLeft() { if isLeftOpen() { closeLeft() setCloseWindowLevel() // Tracking of close tap is put in here. Because closeMenu is due to be call even when the menu tap. - track(.LeftTapClose) + track(.leftTapClose) } else { openLeft() } } - public func isLeftOpen() -> Bool { + open func isLeftOpen() -> Bool { return leftViewController != nil && leftContainerView.frame.origin.x == 0.0 } - public func isLeftHidden() -> Bool { + open func isLeftHidden() -> Bool { return leftContainerView.frame.origin.x <= leftMinOrigin() } - public override func toggleRight() { + open override func toggleRight() { if isRightOpen() { closeRight() setCloseWindowLevel() // Tracking of close tap is put in here. Because closeMenu is due to be call even when the menu tap. - track(.RightTapClose) + track(.rightTapClose) } else { openRight() } } - public func isRightOpen() -> Bool { - return rightViewController != nil && rightContainerView.frame.origin.x == CGRectGetWidth(view.bounds) - rightContainerView.frame.size.width + open func isRightOpen() -> Bool { + return rightViewController != nil && rightContainerView.frame.origin.x == view.bounds.width - rightContainerView.frame.size.width } - public func isRightHidden() -> Bool { - return rightContainerView.frame.origin.x >= CGRectGetWidth(view.bounds) + open func isRightHidden() -> Bool { + return rightContainerView.frame.origin.x >= view.bounds.width } - public func changeMainViewController(mainViewController: UIViewController, close: Bool) { + open func changeMainViewController(_ mainViewController: UIViewController, close: Bool) { removeViewController(self.mainViewController) self.mainViewController = mainViewController setUpViewController(mainContainerView, targetViewController: mainViewController) - if (close) { + if close { closeLeft() closeRight() } } - public func changeLeftViewWidth(width: CGFloat) { + open func changeLeftViewWidth(_ width: CGFloat) { - SlideMenuOptions.leftViewWidth = width; + SlideMenuOptions.leftViewWidth = width var leftFrame: CGRect = view.bounds leftFrame.size.width = width - leftFrame.origin.x = leftMinOrigin(); + leftFrame.origin.x = leftMinOrigin() let leftOffset: CGFloat = 0 leftFrame.origin.y = leftFrame.origin.y + leftOffset leftFrame.size.height = leftFrame.size.height - leftOffset - leftContainerView.frame = leftFrame; + leftContainerView.frame = leftFrame } - public func changeRightViewWidth(width: CGFloat) { + open func changeRightViewWidth(_ width: CGFloat) { - SlideMenuOptions.rightBezelWidth = width; + SlideMenuOptions.rightBezelWidth = width var rightFrame: CGRect = view.bounds rightFrame.size.width = width rightFrame.origin.x = rightMinOrigin() let rightOffset: CGFloat = 0 - rightFrame.origin.y = rightFrame.origin.y + rightOffset; + rightFrame.origin.y = rightFrame.origin.y + rightOffset rightFrame.size.height = rightFrame.size.height - rightOffset - rightContainerView.frame = rightFrame; + rightContainerView.frame = rightFrame } - public func changeLeftViewController(leftViewController: UIViewController, closeLeft:Bool) { + open func changeLeftViewController(_ leftViewController: UIViewController, closeLeft:Bool) { removeViewController(self.leftViewController) self.leftViewController = leftViewController @@ -703,67 +724,67 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } } - public func changeRightViewController(rightViewController: UIViewController, closeRight:Bool) { + open func changeRightViewController(_ rightViewController: UIViewController, closeRight:Bool) { removeViewController(self.rightViewController) - self.rightViewController = rightViewController; + self.rightViewController = rightViewController setUpViewController(rightContainerView, targetViewController: rightViewController) if closeRight { self.closeRight() } } - private func leftMinOrigin() -> CGFloat { + fileprivate func leftMinOrigin() -> CGFloat { return -SlideMenuOptions.leftViewWidth } - private func rightMinOrigin() -> CGFloat { - return CGRectGetWidth(view.bounds) + fileprivate func rightMinOrigin() -> CGFloat { + return view.bounds.width } - private func panLeftResultInfoForVelocity(velocity: CGPoint) -> PanInfo { + fileprivate func panLeftResultInfoForVelocity(_ velocity: CGPoint) -> PanInfo { let thresholdVelocity: CGFloat = 1000.0 let pointOfNoReturn: CGFloat = CGFloat(floor(leftMinOrigin())) + SlideMenuOptions.pointOfNoReturnWidth let leftOrigin: CGFloat = leftContainerView.frame.origin.x - var panInfo: PanInfo = PanInfo(action: .Close, shouldBounce: false, velocity: 0.0) + var panInfo: PanInfo = PanInfo(action: .close, shouldBounce: false, velocity: 0.0) - panInfo.action = leftOrigin <= pointOfNoReturn ? .Close : .Open; + panInfo.action = leftOrigin <= pointOfNoReturn ? .close : .open if velocity.x >= thresholdVelocity { - panInfo.action = .Open + panInfo.action = .open panInfo.velocity = velocity.x } else if velocity.x <= (-1.0 * thresholdVelocity) { - panInfo.action = .Close + panInfo.action = .close panInfo.velocity = velocity.x } return panInfo } - private func panRightResultInfoForVelocity(velocity: CGPoint) -> PanInfo { + fileprivate func panRightResultInfoForVelocity(_ velocity: CGPoint) -> PanInfo { let thresholdVelocity: CGFloat = -1000.0 - let pointOfNoReturn: CGFloat = CGFloat(floor(CGRectGetWidth(view.bounds)) - SlideMenuOptions.pointOfNoReturnWidth) + let pointOfNoReturn: CGFloat = CGFloat(floor(view.bounds.width) - SlideMenuOptions.pointOfNoReturnWidth) let rightOrigin: CGFloat = rightContainerView.frame.origin.x - var panInfo: PanInfo = PanInfo(action: .Close, shouldBounce: false, velocity: 0.0) + var panInfo: PanInfo = PanInfo(action: .close, shouldBounce: false, velocity: 0.0) - panInfo.action = rightOrigin >= pointOfNoReturn ? .Close : .Open + panInfo.action = rightOrigin >= pointOfNoReturn ? .close : .open if velocity.x <= thresholdVelocity { - panInfo.action = .Open + panInfo.action = .open panInfo.velocity = velocity.x - } else if (velocity.x >= (-1.0 * thresholdVelocity)) { - panInfo.action = .Close + } else if velocity.x >= (-1.0 * thresholdVelocity) { + panInfo.action = .close panInfo.velocity = velocity.x } return panInfo } - private func applyLeftTranslation(translation: CGPoint, toFrame:CGRect) -> CGRect { + fileprivate func applyLeftTranslation(_ translation: CGPoint, toFrame:CGRect) -> CGRect { var newOrigin: CGFloat = toFrame.origin.x newOrigin += translation.x @@ -782,7 +803,7 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate return newFrame } - private func applyRightTranslation(translation: CGPoint, toFrame: CGRect) -> CGRect { + fileprivate func applyRightTranslation(_ translation: CGPoint, toFrame: CGRect) -> CGRect { var newOrigin: CGFloat = toFrame.origin.x newOrigin += translation.x @@ -801,21 +822,21 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate return newFrame } - private func getOpenedLeftRatio() -> CGFloat { + fileprivate func getOpenedLeftRatio() -> CGFloat { let width: CGFloat = leftContainerView.frame.size.width let currentPosition: CGFloat = leftContainerView.frame.origin.x - leftMinOrigin() return currentPosition / width } - private func getOpenedRightRatio() -> CGFloat { + fileprivate func getOpenedRightRatio() -> CGFloat { let width: CGFloat = rightContainerView.frame.size.width let currentPosition: CGFloat = rightContainerView.frame.origin.x - return -(currentPosition - CGRectGetWidth(view.bounds)) / width + return -(currentPosition - view.bounds.width) / width } - private func applyLeftOpacity() { + fileprivate func applyLeftOpacity() { let openedLeftRatio: CGFloat = getOpenedLeftRatio() let opacity: CGFloat = SlideMenuOptions.contentViewOpacity * openedLeftRatio @@ -823,125 +844,128 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } - private func applyRightOpacity() { + fileprivate func applyRightOpacity() { let openedRightRatio: CGFloat = getOpenedRightRatio() let opacity: CGFloat = SlideMenuOptions.contentViewOpacity * openedRightRatio opacityView.layer.opacity = Float(opacity) } - private func applyLeftContentViewScale() { + fileprivate func applyLeftContentViewScale() { let openedLeftRatio: CGFloat = getOpenedLeftRatio() - let scale: CGFloat = 1.0 - ((1.0 - SlideMenuOptions.contentViewScale) * openedLeftRatio); + let scale: CGFloat = 1.0 - ((1.0 - SlideMenuOptions.contentViewScale) * openedLeftRatio) let drag: CGFloat = SlideMenuOptions.leftViewWidth + leftContainerView.frame.origin.x - SlideMenuOptions.contentViewDrag == true ? (mainContainerView.transform = CGAffineTransformMakeTranslation(drag, 0)) : (mainContainerView.transform = CGAffineTransformMakeScale(scale, scale)) + SlideMenuOptions.contentViewDrag == true ? (mainContainerView.transform = CGAffineTransform(translationX: drag, y: 0)) : (mainContainerView.transform = CGAffineTransform(scaleX: scale, y: scale)) } - private func applyRightContentViewScale() { + fileprivate func applyRightContentViewScale() { let openedRightRatio: CGFloat = getOpenedRightRatio() let scale: CGFloat = 1.0 - ((1.0 - SlideMenuOptions.contentViewScale) * openedRightRatio) let drag: CGFloat = rightContainerView.frame.origin.x - mainContainerView.frame.size.width - SlideMenuOptions.contentViewDrag == true ? (mainContainerView.transform = CGAffineTransformMakeTranslation(drag, 0)) : (mainContainerView.transform = CGAffineTransformMakeScale(scale, scale)) + SlideMenuOptions.contentViewDrag == true ? (mainContainerView.transform = CGAffineTransform(translationX: drag, y: 0)) : (mainContainerView.transform = CGAffineTransform(scaleX: scale, y: scale)) } - private func addShadowToView(targetContainerView: UIView) { + fileprivate func addShadowToView(_ targetContainerView: UIView) { targetContainerView.layer.masksToBounds = false targetContainerView.layer.shadowOffset = SlideMenuOptions.shadowOffset targetContainerView.layer.shadowOpacity = Float(SlideMenuOptions.shadowOpacity) targetContainerView.layer.shadowRadius = SlideMenuOptions.shadowRadius - targetContainerView.layer.shadowPath = UIBezierPath(rect: targetContainerView.bounds).CGPath + targetContainerView.layer.shadowPath = UIBezierPath(rect: targetContainerView.bounds).cgPath } - private func removeShadow(targetContainerView: UIView) { + fileprivate func removeShadow(_ targetContainerView: UIView) { targetContainerView.layer.masksToBounds = true mainContainerView.layer.opacity = 1.0 } - private func removeContentOpacity() { + fileprivate func removeContentOpacity() { opacityView.layer.opacity = 0.0 } - private func addContentOpacity() { + fileprivate func addContentOpacity() { opacityView.layer.opacity = Float(SlideMenuOptions.contentViewOpacity) } - private func disableContentInteraction() { - mainContainerView.userInteractionEnabled = false + fileprivate func disableContentInteraction() { + mainContainerView.isUserInteractionEnabled = false } - private func enableContentInteraction() { - mainContainerView.userInteractionEnabled = true + fileprivate func enableContentInteraction() { + mainContainerView.isUserInteractionEnabled = true } - private func setOpenWindowLevel() { - if (SlideMenuOptions.hideStatusBar) { - dispatch_async(dispatch_get_main_queue(), { - if let window = UIApplication.sharedApplication().keyWindow { + fileprivate func setOpenWindowLevel() { + if SlideMenuOptions.hideStatusBar { + DispatchQueue.main.async(execute: { + if let window = UIApplication.shared.keyWindow { window.windowLevel = UIWindowLevelStatusBar + 1 } }) } } - private func setCloseWindowLevel() { - if (SlideMenuOptions.hideStatusBar) { - dispatch_async(dispatch_get_main_queue(), { - if let window = UIApplication.sharedApplication().keyWindow { + fileprivate func setCloseWindowLevel() { + if SlideMenuOptions.hideStatusBar { + DispatchQueue.main.async(execute: { + if let window = UIApplication.shared.keyWindow { window.windowLevel = UIWindowLevelNormal } }) } } - private func setUpViewController(targetView: UIView, targetViewController: UIViewController?) { + fileprivate func setUpViewController(_ targetView: UIView, targetViewController: UIViewController?) { if let viewController = targetViewController { - addChildViewController(viewController) viewController.view.frame = targetView.bounds - targetView.addSubview(viewController.view) - viewController.didMoveToParentViewController(self) + + if (!childViewControllers.contains(viewController)) { + addChildViewController(viewController) + targetView.addSubview(viewController.view) + viewController.didMove(toParentViewController: self) + } } } - private func removeViewController(viewController: UIViewController?) { + fileprivate func removeViewController(_ viewController: UIViewController?) { if let _viewController = viewController { _viewController.view.layer.removeAllAnimations() - _viewController.willMoveToParentViewController(nil) + _viewController.willMove(toParentViewController: nil) _viewController.view.removeFromSuperview() _viewController.removeFromParentViewController() } } - public func closeLeftNonAnimation(){ + open func closeLeftNonAnimation(){ setCloseWindowLevel() let finalXOrigin: CGFloat = leftMinOrigin() - var frame: CGRect = leftContainerView.frame; + var frame: CGRect = leftContainerView.frame frame.origin.x = finalXOrigin leftContainerView.frame = frame opacityView.layer.opacity = 0.0 - mainContainerView.transform = CGAffineTransformMakeScale(1.0, 1.0) + mainContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) removeShadow(leftContainerView) enableContentInteraction() } - public func closeRightNonAnimation(){ + open func closeRightNonAnimation(){ setCloseWindowLevel() - let finalXOrigin: CGFloat = CGRectGetWidth(view.bounds) + let finalXOrigin: CGFloat = view.bounds.width var frame: CGRect = rightContainerView.frame frame.origin.x = finalXOrigin rightContainerView.frame = frame opacityView.layer.opacity = 0.0 - mainContainerView.transform = CGAffineTransformMakeScale(1.0, 1.0) + mainContainerView.transform = CGAffineTransform(scaleX: 1.0, y: 1.0) removeShadow(rightContainerView) enableContentInteraction() } // MARK: UIGestureRecognizerDelegate - public func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool { + open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool { - let point: CGPoint = touch.locationInView(view) + let point: CGPoint = touch.location(in: view) if gestureRecognizer == leftPanGesture { return slideLeftForGestureRecognizer(gestureRecognizer, point: point) @@ -957,57 +981,53 @@ public class SlideMenuController: UIViewController, UIGestureRecognizerDelegate } // returning true here helps if the main view is fullwidth with a scrollview - public func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { + open func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return SlideMenuOptions.simultaneousGestureRecognizers } - private func slideLeftForGestureRecognizer( gesture: UIGestureRecognizer, point:CGPoint) -> Bool{ + fileprivate func slideLeftForGestureRecognizer( _ gesture: UIGestureRecognizer, point:CGPoint) -> Bool{ return isLeftOpen() || SlideMenuOptions.panFromBezel && isLeftPointContainedWithinBezelRect(point) } - private func isLeftPointContainedWithinBezelRect(point: CGPoint) -> Bool{ + fileprivate func isLeftPointContainedWithinBezelRect(_ point: CGPoint) -> Bool{ if let bezelWidth = SlideMenuOptions.leftBezelWidth { - var leftBezelRect: CGRect = CGRectZero - var tempRect: CGRect = CGRectZero - - CGRectDivide(view.bounds, &leftBezelRect, &tempRect, bezelWidth, CGRectEdge.MinXEdge) - return CGRectContainsPoint(leftBezelRect, point) + var leftBezelRect: CGRect = CGRect.zero + let tuple = view.bounds.divided(atDistance: bezelWidth, from: CGRectEdge.minXEdge) + leftBezelRect = tuple.slice + return leftBezelRect.contains(point) } else { return true } } - private func isPointContainedWithinLeftRect(point: CGPoint) -> Bool { - return CGRectContainsPoint(leftContainerView.frame, point) + fileprivate func isPointContainedWithinLeftRect(_ point: CGPoint) -> Bool { + return leftContainerView.frame.contains(point) } - private func slideRightViewForGestureRecognizer(gesture: UIGestureRecognizer, withTouchPoint point: CGPoint) -> Bool { + fileprivate func slideRightViewForGestureRecognizer(_ gesture: UIGestureRecognizer, withTouchPoint point: CGPoint) -> Bool { return isRightOpen() || SlideMenuOptions.rightPanFromBezel && isRightPointContainedWithinBezelRect(point) } - private func isRightPointContainedWithinBezelRect(point: CGPoint) -> Bool { + fileprivate func isRightPointContainedWithinBezelRect(_ point: CGPoint) -> Bool { if let rightBezelWidth = SlideMenuOptions.rightBezelWidth { - var rightBezelRect: CGRect = CGRectZero - var tempRect: CGRect = CGRectZero - let bezelWidth: CGFloat = CGRectGetWidth(view.bounds) - rightBezelWidth - - CGRectDivide(view.bounds, &tempRect, &rightBezelRect, bezelWidth, CGRectEdge.MinXEdge) - - return CGRectContainsPoint(rightBezelRect, point) + var rightBezelRect: CGRect = CGRect.zero + let bezelWidth: CGFloat = view.bounds.width - rightBezelWidth + let tuple = view.bounds.divided(atDistance: bezelWidth, from: CGRectEdge.minXEdge) + rightBezelRect = tuple.remainder + return rightBezelRect.contains(point) } else { return true } } - private func isPointContainedWithinRightRect(point: CGPoint) -> Bool { - return CGRectContainsPoint(rightContainerView.frame, point) + fileprivate func isPointContainedWithinRightRect(_ point: CGPoint) -> Bool { + return rightContainerView.frame.contains(point) } } - extension UIViewController { public func slideMenuController() -> SlideMenuController? { @@ -1016,51 +1036,51 @@ extension UIViewController { if viewController is SlideMenuController { return viewController as? SlideMenuController } - viewController = viewController?.parentViewController + viewController = viewController?.parent } - return nil; + return nil } - public func addLeftBarButtonWithImage(buttonImage: UIImage) { - let leftButton: UIBarButtonItem = UIBarButtonItem(image: buttonImage, style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.toggleLeft)) - navigationItem.leftBarButtonItem = leftButton; + public func addLeftBarButtonWithImage(_ buttonImage: UIImage) { + let leftButton: UIBarButtonItem = UIBarButtonItem(image: buttonImage, style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.toggleLeft)) + navigationItem.leftBarButtonItem = leftButton } - public func addRightBarButtonWithImage(buttonImage: UIImage) { - let rightButton: UIBarButtonItem = UIBarButtonItem(image: buttonImage, style: UIBarButtonItemStyle.Plain, target: self, action: #selector(self.toggleRight)) - navigationItem.rightBarButtonItem = rightButton; + public func addRightBarButtonWithImage(_ buttonImage: UIImage) { + let rightButton: UIBarButtonItem = UIBarButtonItem(image: buttonImage, style: UIBarButtonItemStyle.plain, target: self, action: #selector(self.toggleRight)) + navigationItem.rightBarButtonItem = rightButton } - public func toggleLeft() { + @objc public func toggleLeft() { slideMenuController()?.toggleLeft() } - public func toggleRight() { + @objc public func toggleRight() { slideMenuController()?.toggleRight() } - public func openLeft() { + @objc public func openLeft() { slideMenuController()?.openLeft() } - public func openRight() { + @objc public func openRight() { slideMenuController()?.openRight() } - public func closeLeft() { + @objc public func closeLeft() { slideMenuController()?.closeLeft() } - public func closeRight() { + @objc public func closeRight() { slideMenuController()?.closeRight() } // Please specify if you want menu gesuture give priority to than targetScrollView - public func addPriorityToMenuGesuture(targetScrollView: UIScrollView) { + public func addPriorityToMenuGesuture(_ targetScrollView: UIScrollView) { guard let slideController = slideMenuController(), let recognizers = slideController.view.gestureRecognizers else { return } for recognizer in recognizers where recognizer is UIPanGestureRecognizer { - targetScrollView.panGestureRecognizer.requireGestureRecognizerToFail(recognizer) + targetScrollView.panGestureRecognizer.require(toFail: recognizer) } } }