From f5486594765c2adbab23dca0edaf25d6c8e8fbc7 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Thu, 5 Feb 2015 11:46:47 +0800 Subject: [PATCH 1/8] Add push programmatically --- Demos/.DS_Store | Bin 6148 -> 6148 bytes .../TwitterLike.xcodeproj/project.pbxproj | 10 ++ .../xcshareddata/TwitterLike.xccheckout | 41 +++++ .../UserInterfaceState.xcuserstate | Bin 0 -> 30240 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 17 +++ .../xcschemes/TwitterLike.xcscheme | 110 ++++++++++++++ .../xcschemes/xcschememanagement.plist | 27 ++++ .../TwitterLike/TwitterLike/AppDelegate.swift | 140 +++--------------- .../TwitterLike/DemoTableViewController.swift | 116 +++++++++++++++ Demos/TwitterLike/TwitterLike/Info.plist | 2 + .../TwitterLike/Storyboard.storyboard | 62 ++++++++ 11 files changed, 407 insertions(+), 118 deletions(-) create mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcshareddata/TwitterLike.xccheckout create mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme create mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist create mode 100644 Demos/TwitterLike/TwitterLike/DemoTableViewController.swift create mode 100644 Demos/TwitterLike/TwitterLike/Storyboard.storyboard diff --git a/Demos/.DS_Store b/Demos/.DS_Store index 5008ddfcf53c02e82d7eee2e57c38e5672ef89f6..cc6edc078d6c0683772219886cb95a9028831b39 100644 GIT binary patch delta 370 zcmZoMXfc=|#>B)qF;Q%yo}wrt0|NsP3otO0Fr+dRG59cKGGuQ|T+TSzK!l~9n<0du z94JzPEX$CZR9;+=l#`zX)cYf;ASbi9#K7PtBNH%}Xhc35FOLo|#gT5icMbP?TB*)EkhPml~E?oSBrFlUY*9!3l!#0^-%xx&}H5 zre?J|3e|=tCP21@kzsAEz%C9BX-!i{-^ha6u0@NNEM2yI#i1iW&&h%U2NXgeAPk}4 rAjHu~2NHo+1YW5HK<@2y8ZFzQ(fIf%z8GW_AvK4xj>{$am(+{342+ UKzW7)kiy9(Jj$D6L{=~Z03S{czyJUM diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj b/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj index 9305426..f9096fd 100644 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj @@ -7,6 +7,8 @@ objects = { /* Begin PBXBuildFile section */ + F2E173031A8312F800784350 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2E173021A8312F800784350 /* Storyboard.storyboard */; }; + F2E173051A83148200784350 /* DemoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E173041A83148200784350 /* DemoTableViewController.swift */; }; F85CA9771A618E180013CF3F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85CA9761A618E180013CF3F /* AppDelegate.swift */; }; F85CA97E1A618E180013CF3F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F85CA97D1A618E180013CF3F /* Images.xcassets */; }; F85CA98D1A618E180013CF3F /* TwitterLikeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85CA98C1A618E180013CF3F /* TwitterLikeTests.swift */; }; @@ -25,6 +27,8 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + F2E173021A8312F800784350 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; + F2E173041A83148200784350 /* DemoTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoTableViewController.swift; sourceTree = ""; }; F85CA9711A618E180013CF3F /* TwitterLike.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TwitterLike.app; sourceTree = BUILT_PRODUCTS_DIR; }; F85CA9751A618E180013CF3F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F85CA9761A618E180013CF3F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -80,6 +84,8 @@ F85CA9761A618E180013CF3F /* AppDelegate.swift */, F85CA97D1A618E180013CF3F /* Images.xcassets */, F85CA9741A618E180013CF3F /* Supporting Files */, + F2E173021A8312F800784350 /* Storyboard.storyboard */, + F2E173041A83148200784350 /* DemoTableViewController.swift */, ); path = TwitterLike; sourceTree = ""; @@ -201,6 +207,7 @@ files = ( F85CA97E1A618E180013CF3F /* Images.xcassets in Resources */, F85CA9981A618E790013CF3F /* Default-568h@2x.png in Resources */, + F2E173031A8312F800784350 /* Storyboard.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -220,6 +227,7 @@ files = ( F85CA9771A618E180013CF3F /* AppDelegate.swift in Sources */, F85CA9D11A6198F10013CF3F /* SLPagingViewSwift.swift in Sources */, + F2E173051A83148200784350 /* DemoTableViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -324,6 +332,7 @@ buildSettings = { GCC_PREFIX_HEADER = "$SRCROOT/$PROJECT_NAME/TwitterLike-Prefix.pch"; INFOPLIST_FILE = TwitterLike/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -334,6 +343,7 @@ buildSettings = { GCC_PREFIX_HEADER = "$SRCROOT/$PROJECT_NAME/TwitterLike-Prefix.pch"; INFOPLIST_FILE = TwitterLike/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 7.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_NAME = "$(TARGET_NAME)"; }; diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcshareddata/TwitterLike.xccheckout b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcshareddata/TwitterLike.xccheckout new file mode 100644 index 0000000..7b4bdbd --- /dev/null +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcshareddata/TwitterLike.xccheckout @@ -0,0 +1,41 @@ + + + + + IDESourceControlProjectFavoriteDictionaryKey + + IDESourceControlProjectIdentifier + B18B2A30-EB4A-45BF-96CB-7A470CEDBB03 + IDESourceControlProjectName + TwitterLike + IDESourceControlProjectOriginsDictionary + + 37BEB7E0617C793883B527F4F18507B85BD66E2E + github.com:retsohuang/SLPagingViewSwift.git + + IDESourceControlProjectPath + Demos/TwitterLike/TwitterLike.xcodeproj + IDESourceControlProjectRelativeInstallPathDictionary + + 37BEB7E0617C793883B527F4F18507B85BD66E2E + ../../../.. + + IDESourceControlProjectURL + github.com:retsohuang/SLPagingViewSwift.git + IDESourceControlProjectVersion + 111 + IDESourceControlProjectWCCIdentifier + 37BEB7E0617C793883B527F4F18507B85BD66E2E + IDESourceControlProjectWCConfigurations + + + IDESourceControlRepositoryExtensionIdentifierKey + public.vcs.git + IDESourceControlWCCIdentifierKey + 37BEB7E0617C793883B527F4F18507B85BD66E2E + IDESourceControlWCCName + SLPagingViewSwift + + + + diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fb6d6a49a8fe290ea7110da9f7dd45eb01de55b0 GIT binary patch literal 30240 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 literal 0 HcmV?d00001 diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..8f94031 --- /dev/null +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme new file mode 100644 index 0000000..dc4eb09 --- /dev/null +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..6bcab09 --- /dev/null +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,27 @@ + + + + + SchemeUserState + + TwitterLike.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + F85CA9701A618E180013CF3F + + primary + + + F85CA9851A618E180013CF3F + + primary + + + + + diff --git a/Demos/TwitterLike/TwitterLike/AppDelegate.swift b/Demos/TwitterLike/TwitterLike/AppDelegate.swift index f38c29b..dd88075 100644 --- a/Demos/TwitterLike/TwitterLike/AppDelegate.swift +++ b/Demos/TwitterLike/TwitterLike/AppDelegate.swift @@ -9,131 +9,35 @@ import UIKit @UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate, UITableViewDelegate, UITableViewDataSource { +class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? - var nav: UINavigationController? - var controller: SLPagingViewSwift? - var dataSource: NSMutableArray? + var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { - self.window = UIWindow(frame: UIScreen.mainScreen().bounds) - - self.dataSource = NSMutableArray(array: ["Hello world!", "Shaqtin' a fool!", "YEAHHH!", - "Hello world!", "Shaqtin' a fool!", "YEAHHH!", - "Hello world!", "Shaqtin' a fool!", "YEAHHH!", - "Hello world!", "Shaqtin' a fool!", "YEAHHH!", - "Hello world!", "Shaqtin' a fool!", "YEAHHH!"]) - - var navTitleLabel1 = UILabel() - navTitleLabel1.text = "Home" - navTitleLabel1.font = UIFont(name: "Helvetica", size: 20) - navTitleLabel1.textColor = UIColor.whiteColor() - var navTitleLabel2 = UILabel() - navTitleLabel2.text = "Discover" - navTitleLabel2.font = UIFont(name: "Helvetica", size: 20) - navTitleLabel2.textColor = UIColor.whiteColor() - var navTitleLabel3 = UILabel() - navTitleLabel3.text = "Activity" - navTitleLabel3.font = UIFont(name: "Helvetica", size: 20) - navTitleLabel3.textColor = UIColor.whiteColor() - - controller = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], views: [self.tableView(), self.tableView(), self.tableView()], showPageControl: true, navBarBackground: UIColor(red: 0.33, green: 0.68, blue: 0.91, alpha: 1.0)) - - controller?.currentPageControlColor = UIColor.whiteColor() - controller?.tintPageControlColor = UIColor(white: 0.799, alpha: 1.0) - controller?.pagingViewMovingRedefine = ({ scrollView, subviews in - var i = 0 - var xOffset = scrollView.contentOffset.x - for v in subviews { - var lbl = v as UILabel - var alpha = CGFloat(0) - - if(lbl.frame.origin.x > 45 && lbl.frame.origin.x < 145) { - alpha = 1.0 - (xOffset - (CGFloat(i)*320.0)) / 320.0 - } - else if (lbl.frame.origin.x > 145 && lbl.frame.origin.x < 245) { - alpha = (xOffset - (CGFloat(i)*320.0)) / 320.0 + 1.0 - } - else if(lbl.frame.origin.x == 145){ - alpha = 1.0 - } - lbl.alpha = CGFloat(alpha) - i++ - } - }) - - controller?.didChangedPage = ({ currentIndex in - println(currentIndex) - }) - - - self.nav = UINavigationController(rootViewController: self.controller!) - self.window?.rootViewController = self.nav - self.window?.backgroundColor = UIColor.whiteColor() - self.window?.makeKeyAndVisible() - - return true - } + func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + return true + } - 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 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) { - // 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 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) { - // 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 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) { - // 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 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) { - // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. - } - - func tableView() -> UITableView { - var frame = CGRectMake(0, 0, 320, 568) - frame.size.height -= 44 - var tableView = UITableView(frame: frame, style: .Plain) - tableView.delegate = self - tableView.dataSource = self - tableView.scrollsToTop = false - return tableView - } - - // MARK: - UITableView DataSource - - func numberOfSectionsInTableView(tableView: UITableView) -> Int { - return 1 - } - - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - return self.dataSource!.count - } - - func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { - return 120.0 - } - - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - var cellIdentifier = "cellIdentifier" - var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? UITableViewCell - if cell == nil { - cell = UITableViewCell(style: .Default, reuseIdentifier: cellIdentifier) - cell?.textLabel?.numberOfLines = 0 - } - cell!.imageView?.image = UIImage(named: NSString(format: "avatar_%d.jpg", indexPath.row % 3)) - cell!.textLabel!.text = self.dataSource?.objectAtIndex(indexPath.row) as String - - return cell! - } + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } } diff --git a/Demos/TwitterLike/TwitterLike/DemoTableViewController.swift b/Demos/TwitterLike/TwitterLike/DemoTableViewController.swift new file mode 100644 index 0000000..7819529 --- /dev/null +++ b/Demos/TwitterLike/TwitterLike/DemoTableViewController.swift @@ -0,0 +1,116 @@ +// +// DemoTableViewController.swift +// TwitterLike +// +// Created by Retso Huang on 2/5/15. +// Copyright (c) 2015 Stefan Lage. All rights reserved. +// + +import UIKit + +class DemoTableViewController: UIViewController { + + // MARK: - Constants + private let dataSource = ["Hello world!", "Shaqtin' a fool!", "YEAHHH!", + "Hello world!", "Shaqtin' a fool!", "YEAHHH!", + "Hello world!", "Shaqtin' a fool!", "YEAHHH!", + "Hello world!", "Shaqtin' a fool!", "YEAHHH!", + "Hello world!", "Shaqtin' a fool!", "YEAHHH!"] + + private var demoTableView: UITableView { + let demoTableView = UITableView(frame: self.view.frame, style: .Plain) + demoTableView.dataSource = self + demoTableView.scrollsToTop = false + return demoTableView + } + + // MARK: - Life Cycle + override func viewDidLoad() { + super.viewDidLoad() + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + + // MARK: - User Control Events + @IBAction func pushProgrammatically() { + let font = UIFont(name: "Helvetica", size: 20) + + var navTitleLabel1 = UILabel() + navTitleLabel1.text = "Home" + navTitleLabel1.font = font + navTitleLabel1.textColor = UIColor.whiteColor() + var navTitleLabel2 = UILabel() + navTitleLabel2.text = "Discover" + navTitleLabel2.font = font + navTitleLabel2.textColor = UIColor.whiteColor() + var navTitleLabel3 = UILabel() + navTitleLabel3.text = "Activity" + navTitleLabel3.font = font + navTitleLabel3.textColor = UIColor.whiteColor() + + let pagingController = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], views: [self.demoTableView, self.demoTableView, self.demoTableView], showPageControl: true, navBarBackground: UIColor(red: 0.33, green: 0.68, blue: 0.91, alpha: 1.0)) + + pagingController.currentPageControlColor = UIColor.whiteColor() + pagingController.tintPageControlColor = UIColor(white: 0.799, alpha: 1.0) + pagingController.pagingViewMovingRedefine = ({ scrollView, subviews in + var i = 0 + var xOffset = scrollView.contentOffset.x + for v in subviews { + var lbl = v as UILabel + var alpha = CGFloat(0) + + if(lbl.frame.origin.x > 45 && lbl.frame.origin.x < 145) { + alpha = 1.0 - (xOffset - (CGFloat(i)*320.0)) / 320.0 + } + else if (lbl.frame.origin.x > 145 && lbl.frame.origin.x < 245) { + alpha = (xOffset - (CGFloat(i)*320.0)) / 320.0 + 1.0 + } + else if(lbl.frame.origin.x == 145){ + alpha = 1.0 + } + lbl.alpha = CGFloat(alpha) + i++ + } + }) + + pagingController.didChangedPage = ({ currentIndex in + println(currentIndex) + }) + + self.navigationController?.pushViewController(pagingController, animated: true) + + } + +} + +// MARK: - UITableViewDataSource +extension DemoTableViewController: UITableViewDataSource { + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return dataSource.count + } + + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + return 120.0 + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + var cellIdentifier = "cellIdentifier" + + var cell: UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? UITableViewCell + + if cell == nil { + cell = UITableViewCell(style: .Default, reuseIdentifier: cellIdentifier) + cell?.textLabel?.numberOfLines = 0 + } + cell!.imageView?.image = UIImage(named: "avatar_\(indexPath.row % 3)") + cell!.textLabel!.text = self.dataSource[indexPath.row] + + return cell! + } +} diff --git a/Demos/TwitterLike/TwitterLike/Info.plist b/Demos/TwitterLike/TwitterLike/Info.plist index 8b0b716..74145da 100644 --- a/Demos/TwitterLike/TwitterLike/Info.plist +++ b/Demos/TwitterLike/TwitterLike/Info.plist @@ -22,6 +22,8 @@ 1 LSRequiresIPhoneOS + UIMainStoryboardFile + Storyboard UIRequiredDeviceCapabilities armv7 diff --git a/Demos/TwitterLike/TwitterLike/Storyboard.storyboard b/Demos/TwitterLike/TwitterLike/Storyboard.storyboard new file mode 100644 index 0000000..186aede --- /dev/null +++ b/Demos/TwitterLike/TwitterLike/Storyboard.storyboard @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3c06e7139462976bb7d9ecb201763f3a437f7ba7 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Thu, 5 Feb 2015 11:49:33 +0800 Subject: [PATCH 2/8] Add git ignore --- .gitignore | 37 ++++++++++++++++++ .../UserInterfaceState.xcuserstate | Bin 30240 -> 30569 bytes 2 files changed, 37 insertions(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..38e2e5d --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Created by https://www.gitignore.io + +### Swift ### +# Xcode +# +build/ +*.pbxuser +!default.pbxuser +*.mode1v3 +!default.mode1v3 +*.mode2v3 +!default.mode2v3 +*.perspectivev3 +!default.perspectivev3 +xcuserdata +*.xccheckout +*.moved-aside +DerivedData +*.hmap +*.ipa +*.xcuserstate + +# 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 +# + +Pods/ + +# Carthage +# +# Add this line if you want to avoid checking in source code from Carthage dependencies. +# Carthage/Checkouts + +Carthage/Build diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate index fb6d6a49a8fe290ea7110da9f7dd45eb01de55b0..5e3720c1666719e2f3c92daf1d98faa6587f43ea 100644 GIT binary patch delta 13996 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 Date: Thu, 5 Feb 2015 15:22:29 +0800 Subject: [PATCH 3/8] Add storeboard support --- .../TwitterLike.xcodeproj/project.pbxproj | 12 +- .../UserInterfaceState.xcuserstate | Bin 30569 -> 58640 bytes ...troller.swift => DemoViewController.swift} | 42 +- .../TwitterLike/PagingViewController.swift | 47 ++ .../TwitterLike/Storyboard.storyboard | 72 ++- SLPagingViewSwift/SLPagingViewSwift.swift | 610 +++++++++--------- 6 files changed, 444 insertions(+), 339 deletions(-) rename Demos/TwitterLike/TwitterLike/{DemoTableViewController.swift => DemoViewController.swift} (73%) create mode 100644 Demos/TwitterLike/TwitterLike/PagingViewController.swift diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj b/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj index f9096fd..a5957bf 100644 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj +++ b/Demos/TwitterLike/TwitterLike.xcodeproj/project.pbxproj @@ -7,8 +7,9 @@ objects = { /* Begin PBXBuildFile section */ + F2AC2A751A834785006F8ADB /* PagingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2AC2A741A834785006F8ADB /* PagingViewController.swift */; }; F2E173031A8312F800784350 /* Storyboard.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F2E173021A8312F800784350 /* Storyboard.storyboard */; }; - F2E173051A83148200784350 /* DemoTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E173041A83148200784350 /* DemoTableViewController.swift */; }; + F2E173051A83148200784350 /* DemoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F2E173041A83148200784350 /* DemoViewController.swift */; }; F85CA9771A618E180013CF3F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85CA9761A618E180013CF3F /* AppDelegate.swift */; }; F85CA97E1A618E180013CF3F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = F85CA97D1A618E180013CF3F /* Images.xcassets */; }; F85CA98D1A618E180013CF3F /* TwitterLikeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = F85CA98C1A618E180013CF3F /* TwitterLikeTests.swift */; }; @@ -27,8 +28,9 @@ /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ + F2AC2A741A834785006F8ADB /* PagingViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PagingViewController.swift; sourceTree = ""; }; F2E173021A8312F800784350 /* Storyboard.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Storyboard.storyboard; sourceTree = ""; }; - F2E173041A83148200784350 /* DemoTableViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoTableViewController.swift; sourceTree = ""; }; + F2E173041A83148200784350 /* DemoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DemoViewController.swift; sourceTree = ""; }; F85CA9711A618E180013CF3F /* TwitterLike.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TwitterLike.app; sourceTree = BUILT_PRODUCTS_DIR; }; F85CA9751A618E180013CF3F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; F85CA9761A618E180013CF3F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; @@ -85,7 +87,8 @@ F85CA97D1A618E180013CF3F /* Images.xcassets */, F85CA9741A618E180013CF3F /* Supporting Files */, F2E173021A8312F800784350 /* Storyboard.storyboard */, - F2E173041A83148200784350 /* DemoTableViewController.swift */, + F2E173041A83148200784350 /* DemoViewController.swift */, + F2AC2A741A834785006F8ADB /* PagingViewController.swift */, ); path = TwitterLike; sourceTree = ""; @@ -227,7 +230,8 @@ files = ( F85CA9771A618E180013CF3F /* AppDelegate.swift in Sources */, F85CA9D11A6198F10013CF3F /* SLPagingViewSwift.swift in Sources */, - F2E173051A83148200784350 /* DemoTableViewController.swift in Sources */, + F2AC2A751A834785006F8ADB /* PagingViewController.swift in Sources */, + F2E173051A83148200784350 /* DemoViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate index 5e3720c1666719e2f3c92daf1d98faa6587f43ea..adf903032ecb3c1aed0fb3fb648b8409240c5549 100644 GIT binary patch literal 58640 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 literal 30569 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 IXVbd>1M8leQ2+n{ diff --git a/Demos/TwitterLike/TwitterLike/DemoTableViewController.swift b/Demos/TwitterLike/TwitterLike/DemoViewController.swift similarity index 73% rename from Demos/TwitterLike/TwitterLike/DemoTableViewController.swift rename to Demos/TwitterLike/TwitterLike/DemoViewController.swift index 7819529..ea73588 100644 --- a/Demos/TwitterLike/TwitterLike/DemoTableViewController.swift +++ b/Demos/TwitterLike/TwitterLike/DemoViewController.swift @@ -8,7 +8,7 @@ import UIKit -class DemoTableViewController: UIViewController { +class DemoViewController: UIViewController { // MARK: - Constants private let dataSource = ["Hello world!", "Shaqtin' a fool!", "YEAHHH!", @@ -50,30 +50,32 @@ class DemoTableViewController: UIViewController { navTitleLabel3.font = font navTitleLabel3.textColor = UIColor.whiteColor() - let pagingController = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], views: [self.demoTableView, self.demoTableView, self.demoTableView], showPageControl: true, navBarBackground: UIColor(red: 0.33, green: 0.68, blue: 0.91, alpha: 1.0)) - + let pagingController = SLPagingViewSwift(items: [navTitleLabel1, navTitleLabel2, navTitleLabel3], viewsOrControllers: [self.demoTableView, self.demoTableView, self.demoTableView], showPageControl: true, navBarBackground: UIColor(red: 0.33, green: 0.68, blue: 0.91, alpha: 1.0)) + pagingController.currentPageControlColor = UIColor.whiteColor() pagingController.tintPageControlColor = UIColor(white: 0.799, alpha: 1.0) - pagingController.pagingViewMovingRedefine = ({ scrollView, subviews in + pagingController.pagingViewMovingRedefine = { + (scrollView: UIScrollView, subviews: [UIView]) -> Void in var i = 0 var xOffset = scrollView.contentOffset.x - for v in subviews { - var lbl = v as UILabel - var alpha = CGFloat(0) - - if(lbl.frame.origin.x > 45 && lbl.frame.origin.x < 145) { - alpha = 1.0 - (xOffset - (CGFloat(i)*320.0)) / 320.0 - } - else if (lbl.frame.origin.x > 145 && lbl.frame.origin.x < 245) { - alpha = (xOffset - (CGFloat(i)*320.0)) / 320.0 + 1.0 + for view in subviews { + if let titleLabel = view as? UILabel { + var alpha = CGFloat(0) + + if(titleLabel.frame.origin.x > 45 && titleLabel.frame.origin.x < 145) { + alpha = 1.0 - (xOffset - (CGFloat(i)*320.0)) / 320.0 + } + else if (titleLabel.frame.origin.x > 145 && titleLabel.frame.origin.x < 245) { + alpha = (xOffset - (CGFloat(i)*320.0)) / 320.0 + 1.0 + } + else if(titleLabel.frame.origin.x == 145){ + alpha = 1.0 + } + titleLabel.alpha = CGFloat(alpha) + i++ } - else if(lbl.frame.origin.x == 145){ - alpha = 1.0 - } - lbl.alpha = CGFloat(alpha) - i++ } - }) + } pagingController.didChangedPage = ({ currentIndex in println(currentIndex) @@ -86,7 +88,7 @@ class DemoTableViewController: UIViewController { } // MARK: - UITableViewDataSource -extension DemoTableViewController: UITableViewDataSource { +extension DemoViewController: UITableViewDataSource { func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } diff --git a/Demos/TwitterLike/TwitterLike/PagingViewController.swift b/Demos/TwitterLike/TwitterLike/PagingViewController.swift new file mode 100644 index 0000000..8cd2d2d --- /dev/null +++ b/Demos/TwitterLike/TwitterLike/PagingViewController.swift @@ -0,0 +1,47 @@ +// +// PagingViewController.swift +// TwitterLike +// +// Created by Retso Huang on 2/5/15. +// Copyright (c) 2015 Stefan Lage. All rights reserved. +// + +import UIKit + +class PagingViewController: SLPagingViewSwift { + + override func viewDidLoad() { + super.viewDidLoad() + let brownViewController = self.storyboard?.instantiateViewControllerWithIdentifier("BrownViewController") as UIViewController + let purpleViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PurpleViewController") as UIViewController + self.addViewControllers([brownViewController, purpleViewController]) + self.pagingViewMovingRedefine = { + (scrollView: UIScrollView, subviews: [UIView]) -> Void in + var i = 0 + var xOffset = scrollView.contentOffset.x + for view in subviews { + if let titleLabel = view as? UILabel { + var alpha = CGFloat(0) + + if(titleLabel.frame.origin.x > 45 && titleLabel.frame.origin.x < 145) { + alpha = 1.0 - (xOffset - (CGFloat(i)*320.0)) / 320.0 + } + else if (titleLabel.frame.origin.x > 145 && titleLabel.frame.origin.x < 245) { + alpha = (xOffset - (CGFloat(i)*320.0)) / 320.0 + 1.0 + } + else if(titleLabel.frame.origin.x == 145){ + alpha = 1.0 + } + titleLabel.alpha = CGFloat(alpha) + i++ + } + } + } + + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + } + +} diff --git a/Demos/TwitterLike/TwitterLike/Storyboard.storyboard b/Demos/TwitterLike/TwitterLike/Storyboard.storyboard index 186aede..5b5b752 100644 --- a/Demos/TwitterLike/TwitterLike/Storyboard.storyboard +++ b/Demos/TwitterLike/TwitterLike/Storyboard.storyboard @@ -23,10 +23,10 @@ - + - + @@ -44,19 +44,85 @@ + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SLPagingViewSwift/SLPagingViewSwift.swift b/SLPagingViewSwift/SLPagingViewSwift.swift index ff35af4..a72aefd 100644 --- a/SLPagingViewSwift/SLPagingViewSwift.swift +++ b/SLPagingViewSwift/SLPagingViewSwift.swift @@ -18,331 +18,317 @@ enum SLNavigationSideItemsStyle: Int { } typealias SLPagingViewMoving = ((subviews: NSArray)-> ()) -typealias SLPagingViewMovingRedefine = ((scrollView: UIScrollView, subviews: NSArray)-> ()) +typealias SLPagingViewMovingRedefine = (scrollView: UIScrollView, subviews: [UIView]) -> Void typealias SLPagingViewDidChanged = ((currentPage: NSInteger)-> ()) -class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { +public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { - // MARK: - Public properties - var viewControllers: NSDictionary = NSDictionary() - var currentPageControlColor: UIColor? - var tintPageControlColor: UIColor? - var pagingViewMoving: SLPagingViewMoving? - var pagingViewMovingRedefine: SLPagingViewMovingRedefine? - var didChangedPage: SLPagingViewDidChanged? - var navigationSideItemsStyle: SLNavigationSideItemsStyle = .SLNavigationSideItemsStyleDefault - - // MARK: - Private properties - private var SCREENSIZE: CGSize { - return UIScreen.mainScreen().bounds.size - } - private var scrollView: UIScrollView = UIScrollView() - private var pageControl: UIPageControl = UIPageControl() - private var navigationBarView: UIView = UIView() - private var navItems: NSMutableArray = NSMutableArray() - private var needToShowPageControl: Bool = false - private var isUserInteraction: Bool = false - private var indexSelected: NSInteger = 0 - - // MARK: - Constructors - required init(coder decoder: NSCoder) { - super.init(coder: decoder) - } - - override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { - super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) - // Here you can init your properties - } - - // MARK: - Constructors with items & views - convenience init(items: NSArray, views: NSArray) { - self.init(items: items, views: views, showPageControl:false, navBarBackground:UIColor.whiteColor()) - } - - convenience init(items: NSArray, views: NSArray, showPageControl: Bool){ - self.init(items: items, views: views, showPageControl:showPageControl, navBarBackground:UIColor.whiteColor()) - } - - /* - * SLPagingViewController's constructor - * - * @param items should contain all subviews of the navigation bar - * @param navBarBackground navigation bar's background color - * @param views all subviews corresponding to each page - * @param showPageControl inform if we need to display the page control in the navigation bar - * - * @return Instance of SLPagingViewController - */ - init(items: NSArray, views: NSArray, showPageControl: Bool, navBarBackground: UIColor){ - super.init() - needToShowPageControl = showPageControl - navigationBarView.backgroundColor = navBarBackground - isUserInteraction = true - var i: Int = 0 - for item in items{ - if item.isKindOfClass(UIView.classForCoder()){ - var v = item as UIView - var vSize: CGSize = v.isKindOfClass(UILabel.classForCoder()) ? self.getLabelSize(v as UILabel) : v.frame.size - var originX = (self.SCREENSIZE.width/2.0 - vSize.width/2.0) + CGFloat(i * 100) - v.frame = CGRectMake(originX, 8, vSize.width, vSize.height) - v.tag = i - var tap = UITapGestureRecognizer(target: self, action: "tapOnHeader:") - v.addGestureRecognizer(tap) - v.userInteractionEnabled = true - self.navigationBarView.addSubview(v) - self.navItems.addObject(v) - i++ - } - } - - if (views.count > 0){ - var controllerKeys = NSMutableArray() - i = 0 - for controller in views{ - if controller.isKindOfClass(UIView.classForCoder()){ - var ctr = controller as UIView - ctr.tag = i - controllerKeys.addObject(NSNumber(integer: i)) - } - else if controller.isKindOfClass(UIViewController.classForCoder()){ - var ctr = controller as UIViewController - ctr.view.tag = i - controllerKeys.addObject(NSNumber(integer: i)) - } - i++ - } - - if controllerKeys.count == views.count { - self.viewControllers = NSDictionary(objects: views, forKeys: controllerKeys) - } - else{ - var exc = NSException(name: "View Controllers error", reason: "Some objects in viewControllers are not kind of UIViewController!", userInfo: nil) - exc.raise() - } - } - } - - // MARK: - Constructors with controllers - convenience init(controllers: NSArray){ - self.init(controllers: controllers, showPageControl: true, navBarBackground: UIColor.whiteColor()) - } - - convenience init(controllers: NSArray, showPageControl: Bool){ - self.init(controllers: controllers, showPageControl: true, navBarBackground: UIColor.whiteColor()) - } - - /* - * SLPagingViewController's constructor - * - * Use controller's title as a navigation item - * - * @param controllers view controllers containing sall subviews corresponding to each page - * @param navBarBackground navigation bar's background color - * @param showPageControl inform if we need to display the page control in the navigation bar - * - * @return Instance of SLPagingViewController - */ - convenience init(controllers: NSArray, showPageControl: Bool, navBarBackground: UIColor){ - var views = NSMutableArray() - var items = NSMutableArray() - for ctr in controllers { - if ctr.isKindOfClass(UIViewController.classForCoder()) { - views.addObject(ctr) - var item = UILabel() - item.text = ctr.title - items.addObject(item) - } - } - self.init(items: items, views: views, showPageControl:showPageControl, navBarBackground:navBarBackground) - } - - // MARK: - Constructors with items & controllers - convenience init(items: NSArray, controllers: NSArray){ - self.init(items: items, controllers: controllers, showPageControl: true, navBarBackground: UIColor.whiteColor()) - } - convenience init(items: NSArray, controllers: NSArray, showPageControl: Bool){ - self.init(items: items, controllers: controllers, showPageControl: showPageControl, navBarBackground: UIColor.whiteColor()) - } - - /* - * SLPagingViewController's constructor - * - * @param items should contain all subviews of the navigation bar - * @param navBarBackground navigation bar's background color - * @param controllers view controllers containing sall subviews corresponding to each page - * @param showPageControl inform if we need to display the page control in the navigation bar - * - * @return Instance of SLPagingViewController - */ - convenience init(items: NSArray, controllers: NSArray, showPageControl: Bool, navBarBackground: UIColor){ - var views = NSMutableArray() - for ctr in controllers { - if ctr.isKindOfClass(UIViewController.classForCoder()) { - views.addObject(ctr.valueForKey("view")!) - } - } - self.init(items: items, views: views, showPageControl:showPageControl, navBarBackground:navBarBackground) - } - - // MARK: - Life cycle - override func viewDidLoad() { - super.viewDidLoad() - // Do any additional setup after loading the view, typically from a nib. - self.setupPagingProcess() - self.setCurrentIndex(self.indexSelected, animated: false) - } - - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - override func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - self.navigationBarView.frame = CGRectMake(0, 0, self.SCREENSIZE.width, 44) - } - - // MARK: - Public methods - - /* - * Update the state of the UserInteraction on the navigation bar - * - * @param activate state you want to set to UserInteraction - */ - func updateUserInteractionOnNavigation(active: Bool){ - self.isUserInteraction = active - } - - /* - * Set the current index page and scroll to its position - * - * @param index of the wanted page - * @param animated animate the moving - */ - func setCurrentIndex(index: NSInteger, animated: Bool){ - // Be sure we got an existing index - if(index < 0 || index > self.navigationBarView.subviews.count-1){ - var exc = NSException(name: "Index out of range", reason: "The index is out of range of subviews's countsd!", userInfo: nil) - exc.raise() - } - self.indexSelected = index - // Get the right position and update it - var xOffset = CGFloat(index) * self.SCREENSIZE.width - self.scrollView.setContentOffset(CGPointMake(xOffset, self.scrollView.contentOffset.y), animated: animated) - } - - // MARK: - Internal methods - private func setupPagingProcess() { - var frame: CGRect = CGRectMake(0, 0, SCREENSIZE.width, self.view.frame.height) + // MARK: - Public properties + var viewsOrContrllers = [Int: UIResponder]() + var currentPageControlColor: UIColor? + var tintPageControlColor: UIColor? + var pagingViewMoving: SLPagingViewMoving? + var pagingViewMovingRedefine: SLPagingViewMovingRedefine? + var didChangedPage: SLPagingViewDidChanged? + var navigationSideItemsStyle: SLNavigationSideItemsStyle = .SLNavigationSideItemsStyleDefault + + // MARK: - Private properties + private var screenSize: CGSize { + return UIScreen.mainScreen().bounds.size + } + private var scrollView: UIScrollView = UIScrollView() + private var pageControl: UIPageControl = UIPageControl() + private var navigationBarView: UIView = UIView() + private var navigationItems = [UIView]() + private var needToShowPageControl: Bool = false + private var isUserInteraction: Bool = false + private var indexSelected: NSInteger = 0 + + // MARK: - Constructors + required public init(coder decoder: NSCoder) { + super.init(coder: decoder) + } + + override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { + super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) + // Here you can init your properties + } + + // MARK: - Constructors with controllers - self.scrollView = UIScrollView(frame: frame) - self.scrollView.backgroundColor = UIColor.clearColor() - self.scrollView.pagingEnabled = true - self.scrollView.showsHorizontalScrollIndicator = false - self.scrollView.showsVerticalScrollIndicator = false - self.scrollView.delegate = self - self.scrollView.bounces = false - self.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: -80, right: 0) - - self.view.addSubview(self.scrollView) - - // Adds all views - self.addViews() - - if(self.needToShowPageControl){ - // Make the page control - self.pageControl = UIPageControl(frame: CGRectMake(0, 35, 0, 0)) - self.pageControl.numberOfPages = self.navigationBarView.subviews.count - self.pageControl.currentPage = 0 - if self.currentPageControlColor != nil { - self.pageControl.currentPageIndicatorTintColor = self.currentPageControlColor - } - if self.tintPageControlColor != nil { - self.pageControl.pageIndicatorTintColor = self.tintPageControlColor - } - self.navigationBarView.addSubview(self.pageControl) - } - - self.navigationController?.navigationBar.addSubview(self.navigationBarView) - + /* + * SLPagingViewController's constructor + * + * Use controller's title as a navigation item + * + * @param controllers view controllers containing sall subviews corresponding to each page + * @param navBarBackground navigation bar's background color + * @param showPageControl inform if we need to display the page control in the navigation bar + * + * @return Instance of SLPagingViewController + */ + convenience init(controllers: [UIViewController], showPageControl: Bool = true, navBarBackground: UIColor = UIColor.whiteColor()) { + self.init(items: SLPagingViewSwift.navigationTitleLabels(controllers), viewsOrControllers: controllers, showPageControl:showPageControl, navBarBackground:navBarBackground) + } + + // MARK: - Constructors with items & controllers + + /* + * SLPagingViewController's constructor + * + * @param items should contain all subviews of the navigation bar + * @param navBarBackground navigation bar's background color + * @param controllers view controllers containing sall subviews corresponding to each page + * @param showPageControl inform if we need to display the page control in the navigation bar + * + * @return Instance of SLPagingViewController + */ + convenience init(items: [UIView], controllers: [UIViewController], showPageControl: Bool = true, navBarBackground: UIColor = UIColor.whiteColor()) { + self.init(items: items, viewsOrControllers: controllers, showPageControl:showPageControl, navBarBackground:navBarBackground) + } + + // MARK: - Constructors with items & views + + /* + * SLPagingViewController's constructor + * + * @param items should contain all subviews of the navigation bar + * @param navBarBackground navigation bar's background color + * @param viewsOrControllers all view or view controller corresponding to each page + * @param showPageControl inform if we need to display the page control in the navigation bar + * + * @return Instance of SLPagingViewController + */ + init(items: [UIView], viewsOrControllers: [UIResponder], showPageControl: Bool = false, navBarBackground: UIColor = UIColor.whiteColor()) { + super.init() + needToShowPageControl = showPageControl + navigationBarView.backgroundColor = navBarBackground + isUserInteraction = true + self.setup(items, viewsOrControllers: viewsOrControllers) + } + + // MARK: - Life cycle + override public func viewDidLoad() { + super.viewDidLoad() + if self.viewsOrContrllers.count > 0 { + self.setupPagingProcess() + self.setCurrentIndex(self.indexSelected, animated: false) } - - // Loads all views - private func addViews() { - if self.viewControllers.count > 0 { - let width = SCREENSIZE.width * CGFloat(self.viewControllers.count) - let height = self.view.frame.height - self.scrollView.contentSize = CGSize(width: width, height: height) - var i: Int = 0 - self.viewControllers.enumerateKeysAndObjectsUsingBlock({ key, obj, stop in - var rect: CGRect = CGRectMake(self.SCREENSIZE.width * CGFloat(i), 0, self.SCREENSIZE.width, self.SCREENSIZE.height) - var v = obj as UIView - v.frame = rect - self.scrollView.addSubview(v) - i++ - }) - } + } + + override public func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + override public func viewWillLayoutSubviews() { + super.viewWillLayoutSubviews() + self.navigationBarView.frame = CGRectMake(0, 0, screenSize.width, 44) + } + + // MARK: - Public methods + + /** + Add UIViewController(s) in to scrool View and automatically add navigation title as same as call init(controllers:showPageControl:navBarBackground:). + + :param: viewControllers view controllers containing sall subviews corresponding to each page + */ + public func addViewControllers(viewControllers: [UIViewController]) { + self.setup(SLPagingViewSwift.navigationTitleLabels(viewControllers), viewsOrControllers: viewControllers) + self.setupPagingProcess() + self.setCurrentIndex(self.indexSelected, animated: false) + } + + /* + * Update the state of the UserInteraction on the navigation bar + * + * @param activate state you want to set to UserInteraction + */ + func updateUserInteractionOnNavigation(active: Bool){ + self.isUserInteraction = active + } + + /* + * Set the current index page and scroll to its position + * + * @param index of the wanted page + * @param animated animate the moving + */ + func setCurrentIndex(index: NSInteger, animated: Bool){ + // Be sure we got an existing index + if(index < 0 || index > self.navigationBarView.subviews.count - 1){ + var exc = NSException(name: "Index out of range", reason: "The index is out of range of subviews's countsd!", userInfo: nil) + exc.raise() + } + self.indexSelected = index + // Get the right position and update it + var xOffset = CGFloat(index) * self.screenSize.width + self.scrollView.setContentOffset(CGPointMake(xOffset, self.scrollView.contentOffset.y), animated: animated) + } + + // MARK: - Internal methods + private func setup(items: [UIView], viewsOrControllers: [UIResponder]) { + var i = 0 + for item in items { + var vSize: CGSize = item.isKindOfClass(UILabel.classForCoder()) ? self.getLabelSize(item as UILabel) : item.frame.size + var originX = (screenSize.width/2.0 - vSize.width/2.0) + CGFloat(i * 100) + item.frame = CGRectMake(originX, 8, vSize.width, vSize.height) + item.tag = i + var tap = UITapGestureRecognizer(target: self, action: "tapOnHeader:") + item.addGestureRecognizer(tap) + item.userInteractionEnabled = true + self.navigationBarView.addSubview(item) + self.navigationItems.append(item) + i++ } - private func getLabelSize(lbl: UILabel) -> CGSize{ - var txt = lbl.text! - return txt.sizeWithAttributes([NSFontAttributeName: lbl.font]) + var index = 0 + for viewOrController in viewsOrControllers { + if let view = viewOrController as? UIView { + view.tag = index + viewsOrContrllers[index] = view + } + if let controller = viewOrController as? UIViewController { + controller.view.tag = index + viewsOrContrllers[index] = controller + } + index++ } - - private func sendNewIndex(scrollView: UIScrollView){ - var xOffset = Float(scrollView.contentOffset.x) - var currentIndex = (Int(roundf(xOffset)) % (self.navigationBarView.subviews.count * Int(self.SCREENSIZE.width))) / Int(self.SCREENSIZE.width) - if(self.pageControl.currentPage != currentIndex) { - self.pageControl.currentPage = currentIndex - if self.didChangedPage != nil { - self.didChangedPage!(currentPage: currentIndex) - } - } + } + private class func navigationTitleLabels(viewControllers: [UIViewController]) -> [UILabel] { + var titleLabels = [UILabel]() + for viewController in viewControllers { + var titleLabel = UILabel() + titleLabel.text = viewController.title + titleLabels.append(titleLabel) } - - func getOriginX(vSize: CGSize, idx: CGFloat, distance: CGFloat, xOffset: CGFloat) -> CGFloat{ - var result = self.SCREENSIZE.width / 2.0 - vSize.width/2.0 - result += (idx * distance) - result -= xOffset / (self.SCREENSIZE.width / distance) - return result + return titleLabels + } + private func setupPagingProcess() { + var frame: CGRect = CGRectMake(0, 0, screenSize.width, self.view.frame.height) + + self.scrollView = UIScrollView(frame: frame) + self.scrollView.backgroundColor = UIColor.clearColor() + self.scrollView.pagingEnabled = true + self.scrollView.showsHorizontalScrollIndicator = false + self.scrollView.showsVerticalScrollIndicator = false + self.scrollView.delegate = self + self.scrollView.bounces = false + self.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: -80, right: 0) + + self.view.addSubview(self.scrollView) + + // Adds all views + self.addViews() + + if(self.needToShowPageControl){ + // Make the page control + self.pageControl = UIPageControl(frame: CGRectMake(0, 35, 0, 0)) + self.pageControl.numberOfPages = self.navigationBarView.subviews.count + self.pageControl.currentPage = 0 + if self.currentPageControlColor != nil { + self.pageControl.currentPageIndicatorTintColor = self.currentPageControlColor + } + if self.tintPageControlColor != nil { + self.pageControl.pageIndicatorTintColor = self.tintPageControlColor + } + self.navigationBarView.addSubview(self.pageControl) + } + + self.navigationController?.navigationBar.addSubview(self.navigationBarView) + + } + + // Loads all views + private func addViews() { + var index = 0 + for (key, viewOrViewController) in viewsOrContrllers { + let width = screenSize.width * CGFloat(viewsOrContrllers.count) + let height = self.view.frame.height + self.scrollView.contentSize = CGSize(width: width, height: height) + let viewFrame = CGRect(x: screenSize.width * CGFloat(index), y: 0, width: screenSize.width, height: screenSize.height) + if let view = viewOrViewController as? UIView { + view.frame = viewFrame + scrollView.addSubview(view) + } + if let viewController = viewOrViewController as? UIViewController { + viewController.view.frame = viewFrame + scrollView.addSubview(viewController.view) + } + index++ } - - // Scroll to the view tapped - func tapOnHeader(recognizer: UITapGestureRecognizer){ - if(self.isUserInteraction){ - var key = recognizer.view?.tag - var view = self.viewControllers.objectForKey(NSNumber(integer: key!)) as UIView - self.scrollView.scrollRectToVisible(view.frame, animated: true) + } + + private func getLabelSize(lbl: UILabel) -> CGSize{ + var txt = lbl.text! + return txt.sizeWithAttributes([NSFontAttributeName: lbl.font]) + } + + private func sendNewIndex(scrollView: UIScrollView){ + var xOffset = Float(scrollView.contentOffset.x) + var currentIndex = (Int(roundf(xOffset)) % (self.navigationBarView.subviews.count * Int(self.screenSize.width))) / Int(self.screenSize.width) + if(self.pageControl.currentPage != currentIndex) { + self.pageControl.currentPage = currentIndex + if self.didChangedPage != nil { + self.didChangedPage!(currentPage: currentIndex) + } + } + } + + func getOriginX(vSize: CGSize, idx: CGFloat, distance: CGFloat, xOffset: CGFloat) -> CGFloat{ + var result = self.screenSize.width / 2.0 - vSize.width/2.0 + result += (idx * distance) + result -= xOffset / (self.screenSize.width / distance) + return result + } + + // Scroll to the view tapped + func tapOnHeader(recognizer: UITapGestureRecognizer){ + if(self.isUserInteraction){ + if let key = recognizer.view?.tag { + var viewToScroll: UIView! + if let view = viewsOrContrllers[key] as? UIView { + viewToScroll = view + } else if let viewController = viewsOrContrllers[key] as? UIViewController { + viewToScroll = viewController.view + } + self.scrollView.scrollRectToVisible(viewToScroll.frame, animated: true) } - } - - // MARK: - UIScrollViewDelegate + } + } + + + + - func scrollViewDidScroll(scrollView: UIScrollView) { - var xOffset = scrollView.contentOffset.x - var i = 0 - for obj in self.navItems { - var v:UIView = obj as UIView - var distance = 100 + self.navigationSideItemsStyle.rawValue - var vSize = v.frame.size - var originX = self.getOriginX(vSize, idx: CGFloat(i), distance: CGFloat(distance), xOffset: CGFloat(xOffset)) - v.frame = CGRectMake(originX, 8, vSize.width, vSize.height) - i++ - } - if (self.pagingViewMovingRedefine != nil) { - self.pagingViewMovingRedefine!(scrollView: scrollView, subviews: self.navItems) - } - if (self.pagingViewMoving != nil) { - self.pagingViewMoving!(subviews: self.navItems) - } +} + +// MARK: - UIScrollViewDelegate +extension SLPagingViewSwift: UIScrollViewDelegate { + public func scrollViewDidScroll(scrollView: UIScrollView) { + var xOffset = scrollView.contentOffset.x + var i = 0 + for obj in self.navigationItems { + var v:UIView = obj as UIView + var distance = 100 + self.navigationSideItemsStyle.rawValue + var vSize = v.frame.size + var originX = self.getOriginX(vSize, idx: CGFloat(i), distance: CGFloat(distance), xOffset: CGFloat(xOffset)) + v.frame = CGRectMake(originX, 8, vSize.width, vSize.height) + i++ } - - func scrollViewDidEndDecelerating(scrollView: UIScrollView) { - self.sendNewIndex(scrollView) + if (self.pagingViewMovingRedefine != nil) { + self.pagingViewMovingRedefine!(scrollView: scrollView, subviews: self.navigationItems) } - - func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { - self.sendNewIndex(scrollView) + if (self.pagingViewMoving != nil) { + self.pagingViewMoving!(subviews: self.navigationItems) } - + } + + public func scrollViewDidEndDecelerating(scrollView: UIScrollView) { + self.sendNewIndex(scrollView) + } + + public func scrollViewDidEndScrollingAnimation(scrollView: UIScrollView) { + self.sendNewIndex(scrollView) + } } \ No newline at end of file From c99cd2f05dc8814f929f52b496ced5cc3a1555d1 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Thu, 5 Feb 2015 15:23:03 +0800 Subject: [PATCH 4/8] Git clean --- Demos/.DS_Store | Bin 6148 -> 0 bytes Demos/TinderLike/.DS_Store | Bin 6148 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 17082 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcschemes/TinderLike.xcscheme | 110 ------------------ .../xcschemes/xcschememanagement.plist | 27 ----- Demos/TwitterLike/.DS_Store | Bin 6148 -> 0 bytes .../xcshareddata/TwitterLike.xccheckout | 41 ------- .../UserInterfaceState.xcuserstate | Bin 58640 -> 0 bytes .../UserInterfaceState.xcuserstate | Bin 37374 -> 0 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 17 --- .../xcschemes/TwitterLike.xcscheme | 110 ------------------ .../xcschemes/xcschememanagement.plist | 27 ----- .../xcdebugger/Breakpoints_v2.xcbkptlist | 5 - .../xcschemes/TwitterLike.xcscheme | 110 ------------------ .../xcschemes/xcschememanagement.plist | 27 ----- 16 files changed, 479 deletions(-) delete mode 100644 Demos/.DS_Store delete mode 100644 Demos/TinderLike/.DS_Store delete mode 100644 Demos/TinderLike/TinderLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TinderLike.xcscheme delete mode 100644 Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Demos/TwitterLike/.DS_Store delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcshareddata/TwitterLike.xccheckout delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TwitterLike.xcscheme delete mode 100644 Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/Demos/.DS_Store b/Demos/.DS_Store deleted file mode 100644 index cc6edc078d6c0683772219886cb95a9028831b39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKUrQT75TA{)Ud+ptDiwUWS3w~WEqy#w`=$_xBovi+#~oy8xC^eeu#dPK6Ykz4TjjaA`)hfncwW(%pUt&*u4P&(HKQ_02crpRKijP%@acJN#~?w zBLWc>=TH#C5RO2?=ecYSyhH|Q@2YSDIqsR7*}piWeS5B>MM^~uD&ah%Pq{e$CAgUQ!#-+%o4b#;AvXSPHT3nXt0Ozr*DV}}`F2AF|G zV!)nyPIZwM#cN>(n1TPo0G$sWDxq(&FsP3XG`a;qEMr&;`qWEMjc3ufSQx}ND8iH? zno?m~3}MPK?%6!wVqwsfgRsqquwNFoLlOGxIKQXULHGvQG6T%OECWks=+gcF@!$Rb zY!Q!`0cK#K7!c*d)?oveWbf9w#nD~sp3(3H0u|ly0Hovu9E3!OlPL2Ae!!FHXn6{=yXGJw z1=k=1yOKTj+Ou{>itPmuW~*unOaP2o1cNjNOx%M*TY2(`7&OKLcR0lruCW*h^c!8W z_XC`9&$pyP~(;Q=KY^|tgkSl(Pr=Vep3_92fan{ex%rHT2pQa0Og}wE}WJL>9r6u`|@8gO#QL zM0rN5u`RiTaAL-ku`}cdEf|$()R0q*V08Lpo|iIqhDJxo$w$a5zb7w2S7-dF(-D%P z*RFso&{tsFx)ZtokNL|CCi#7e_gn#2;EyQ~M#a3C@uTwH`sMTFu8l0`EMhXRlLn3L l-Xnk=IY$n4(8i;*IWJ}G3?+*Al}_}BfC}Q3EARsfya5wKKFI(8 diff --git a/Demos/TinderLike/TinderLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TinderLike/TinderLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index b1a9203833f5291b734adf4f70c61dd6a94a5e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17082 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 diff --git a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b454..0000000 --- a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TinderLike.xcscheme b/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TinderLike.xcscheme deleted file mode 100644 index 5db44c2..0000000 --- a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TinderLike.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist b/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index d792c89..0000000 --- a/Demos/TinderLike/TinderLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - TinderLike.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - F85CA9A41A61963B0013CF3F - - primary - - - F85CA9B91A61963B0013CF3F - - primary - - - - - diff --git a/Demos/TwitterLike/.DS_Store b/Demos/TwitterLike/.DS_Store deleted file mode 100644 index 1f3033c6ad23290b36043ffcf5fdce9499d148c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKOG?B*5PhWs4!9W?g3CUEI5!AG+_@VMAS8pIF(gO^UFKNcLU(Sxf;aG0S34Ta zCL0m03SF=IQ`OxM(%l6>7MpSo%m7ST6h(~z(dNOfoiuntlo+GM3U@feHP!=xeq)oa z{SfE4=bBr7pX*=Y7!N2=qhxEtebu - - - - IDESourceControlProjectFavoriteDictionaryKey - - IDESourceControlProjectIdentifier - B18B2A30-EB4A-45BF-96CB-7A470CEDBB03 - IDESourceControlProjectName - TwitterLike - IDESourceControlProjectOriginsDictionary - - 37BEB7E0617C793883B527F4F18507B85BD66E2E - github.com:retsohuang/SLPagingViewSwift.git - - IDESourceControlProjectPath - Demos/TwitterLike/TwitterLike.xcodeproj - IDESourceControlProjectRelativeInstallPathDictionary - - 37BEB7E0617C793883B527F4F18507B85BD66E2E - ../../../.. - - IDESourceControlProjectURL - github.com:retsohuang/SLPagingViewSwift.git - IDESourceControlProjectVersion - 111 - IDESourceControlProjectWCCIdentifier - 37BEB7E0617C793883B527F4F18507B85BD66E2E - IDESourceControlProjectWCConfigurations - - - IDESourceControlRepositoryExtensionIdentifierKey - public.vcs.git - IDESourceControlWCCIdentifierKey - 37BEB7E0617C793883B527F4F18507B85BD66E2E - IDESourceControlWCCName - SLPagingViewSwift - - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/retsohuang.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index adf903032ecb3c1aed0fb3fb648b8409240c5549..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 58640 zcmeFa2YeGp(?5Q@chVJATBu13rUj6DB_To0V6ZL6vH?SgFtz{%V>yyd36R{T_ueZu zCB66Fdndj3-jgT2{bufTDlW7<&-1>Y_y14$*p_bgyR);iv$L~vyNlafBk_*Bycapb zQI6*X&cvCW$2pImH+E$>7LP>R=8cUmJ}BJW5pNvZ6l-1Cs<|32z(u)EZY8&l zQ#r;R#U0HZ&z-=X!kx;U$(_ZW$DPkz%w585 zNhv8KpHr z7CD=oL(V1Vk@M;K^kUjgH`B}LmGl~VJ-vzEO7Ea|)BEUy^bz_veTqIyx6+sBtMm=} zHhqtNNI#*U)34~a^auJA{gwVf|K=%g;w9d~+xY?fV16h+g5RCb;6i&HMNn{4BnjujPaM9KMl1fDiGD`7pnXU(UDj2lE~LD*h0DJ+Jad@JI8< z@h9@9@Tc=<@#pdv@E7x4{3iZV{tEtT{yP3f{ucgr{x1Gr{sI1B{xSYZ{u%yx{zd*3 z{&oH>{$2h9{$u_#{!9KF{(JsM{ulmt{x5+Df*=ZtU=y6eAYnIQxG+lCQy3$R6DA6i zg&ZMYC=yDAslqg2y5JQmgi4`G2ncmTgD_86ARH((2`$1>;UHm!&@RMCj4pQOuWf#l1)~V!!*z|#5Bw_(zJ(Z zv}vqqf@zY;Wy&)Zno3ONrhQENnLH-HX{Kqmsm8Rwsopf#G~cw)w8+$KT4IWrT1`)>3P#u)61q; zOmCRpG`(wj&-9V$W7FrRFHGNJ^rPul({HA~On;ksvtX9Yve{;~n+KW)nfEkj znMa$)n6u4e&Ew4D%?0K{bCJ2&Tw*RYmzm4WeshI+hIyvB-rQiGW1eenHn*6=<|XE( z=4IxH`5^O3^D6Ud^BVI}=A+HWn2$A|X+Fz*w)q_MM)M}~X7d*F4dxroH<@oX-*0}v z{GjaumD2@@c z#j)ZzalAM|oG4Bfr-%h&p;#nN7u}*q^ol;wFII>(VnD1F_ZRELpg31tC^m_U#h4fu zJH$?LrMOC5Ev^yQiK=+Cc#L?wc%pcUc!qe6c#(Lqc!_wkc#C+ec$;{;c!zkWc$av$ zc#n9mc%OK`_<;DJ__X+p_^kMx_^SB6_<{JL_>uUr_=)(b_`Udp_%HEC@o$Nfh(sl; zWRvXDKxsE=yfi_YDD5Rpk|s;JQh`(`6-i~1U#gU5Np(_Cs+Sf^%~FdLmX=6MrDak? zIzl>9I!ZcPIz~EHI!-!XIzc*7I!QWNI#W7JI$!FRHcD4YS4nqBcS?6jcT4w3_e#%7 z&q>cqTcsDI7p0e^H>5YE_oWY{ucWV~Z=`RfpQJxzDoe5~JLEy~Uh*V)vOGn0$vJYa zoG0hY1#+QWBA3hi$ot72xlRts^>TweN1iJ;$&2M?xkX+kN92R#<#MaMLS7>uBCnO1 ze7JnHe4>1+e42coe7<~v+$CQsUn^fHUoYP--yz>AKPW#WKP*2YzbU^Zzb(Hbzbn5d zzb}6ve<*(>eQ7%v} zR4!94SFTX5RIXBPQ*Kx8Q0`RjQXWtqRi0IzQ=V5|Q(jlzP~KDCS3Xs~Qhro^Qhrwc zws00=F(mIo{kTOPAKX?e!-yyX?kTb7S3A6ve*d}I09 z@{5(T4zmuo?rzPt?qw~smRc*Vv#fKhbFK5Njn)qCet&dorvp#R#YJI`_iuE(= z=hiQ*Us}Jier^56`mOal>z~%Ytbf}$o7rZu4X_Qg4YCcljj)Zh?P<%hjkb-kW!om$ zCflaiN^DbYRkmu|Lfe71kZqBz$+p<_@3fncdYi-xruD9K6yWMt&?Gf8n+pD&>Y#-S^ zwta2;#`dG_cROd7?6Q4;eV~1keX@Ou-DS_Q=i2k^`St>Pp}ojnWv{k}?aS>)*pIXy zWk1?}jQv>qarWcwC)iK4pJYG7ey06AdzZc2eue!?`_1-S?6=x)vp;5k-2R09N&8dw zr|r+!U$nn&f5ZNf{bTzl_HXRp+P|~^Z2!~2J7kCAa5@G%COIZMrZ`-V97nDr&ynva za1=U99OaIE9Q!#uj+u@c#~jC8N64|rvCI*19PEfWj&&U8INouB<3z_vj*}gyI8Jq( z<~ZANfuqaO?YPWwmE&s1^^Thzw>a)_-08T_@sQ&Q$CHld9d9_^aeU|a)A5(%Zztz8 zJFQNqbFg!mbGUPN=V<3R=Xhs@0vD`RrJU4-x$nC{V;wE!bxNOy_4p0X&vWn56jE-P*FGi~v zt!A_q9+d;P)seP{FTA*O>C#BsQg5^^9&HW7*Pd9oX?c4z($*1oH+Mu&-KaIkqJ3w-JF;7!G+@ckXbgZchw?|_j zQima3y*^-JSY5ao%INGFPj&7_)i*8H7=|`>gjaU}+we_I(~59)Q#&y4Zf~!E&WcyI zWk^JljXs&idAXd;+`im?+;q;(dDKDbV0DPPn>ute=i~fb1vi76sSZPQV|&t5oCyu7T?=XVtq<>kAIN_;-xy)55VT3l3AT#)Z~R}`0| z^K+brGrAX!&sSJcT_uPeESDC-8$dzC2%PT1?a~F9F^V4z8&~V1}!YL@r%P%X2hLo2U7Xv>P zWv;R!Z@H_eu+U$gU*f4K_4?Cs&ed=x^uo#Wl$I8h6c)M4eC1Hu3nF$Gm6y7_6~2m+ za-ToX=gHvbA`NG+UO2uAzqh#5Q|c-%D6Vi76%=_~Zf}9xUzVXi*K0WWy>R?_*v&;nE}tJ}xuUZCQjkw!q03)VR8U+B;wto4q_^u9 z4X3a-j<+wwLRtCZ@%q#E}`18C49=F%9TK91GaXDSwy=rL}cfVSOhI|j7XGUUr1aqC3 z0Gngc*4DbFwx!`YYxAaLm8{n-!z0|IA?Ki)V0C9l)8f{!F9I`Yw5=(&W+V3q_ZYYK zfSO?HJEP7gxTlhJKCSMpmd{1V{DSoc!Smb;NrD&EX$gXYq9nnq-0Mk#H`M(MgcQL$ z+hI#T=i3#F!TZ0spOVNwt25N{ zMr>R`ae0cl-?=}N;2Lv@vV;)cC`$x&R)VWCgKHuY#dywT6tokk@qi3as}lv2HIgA@ zsPR0r;7GDNKG52kfjF9E!viu#-M@>BRf8F`4B1Olyt(x55f{lJxg<}mR~yth>fBAFfE1DU?a`0NH+G)Zc;_6)dSU#x@aN5 zRJMTU7+Det$3jjgd`86TrloC>j!yKMMyKSIQDLfB_Vn;{4*%1Qz+%hWnX4#{@k zam0+kgsmQ<1u?Rc%h^ccq=R&-2dT@|){SHpSxwfcE7UeM3gb)fuQ|Gcgq&mgWiw3| z`ftmEv{9h9i($JCSKFao22)3o6SdGzTByut= zir{~8y1I&ymADp4{9BD0l!l1Cj4Q0+G z(w>d&x0SvKjHsqH)tb|toknKVF{i1u6Q+kWs@>D5GDm@qk}gsM1s5@CAiAh7AQjg- z|0EZZi^#>~60(7Gk#4e)Y$BV<7IG=Mj9gBxAXk#B$kpT;axJ-zTu*KwHlP}1Z%5N`521lRwCxHNEYNjHUs7w`Vp;l_6 zcIu!`I)DzOgXmy7gziR%(qVKs9YIIZQFM2@2i=oq(b04a&8B1NI69tApcCm{bP}CR zr%)Hop}91V=FbZ@#3oksVi`_bvtO+D00ebi4Y=nOiOR?=B? zHm#!7w1x&~E#05i(IBm-4Rj8jOXtx>I-f3}2hfG|KpLWpXcJvbn`sLT(Y?gks;V;eaPSlF|dZ~JudbxUqdZl`mdbN6udaZh$dcAssdZT)idb4_qdaHVy zdb@gudZ&7qdbfIydart)dcXRB`k?xd`mp+l`l$Mt`ndXp`lR}l`n39t`mFk#`n-{Y3p#{Y?E_{X+dx z{Yw2>{YL#({Z9Q}{XzYg`lI@j`m_3r`m6ez`n&pv`ltGr`ZpsSBZLvk2+xSXh=~z1 zBO)UbBQhfjBNj%ijMx~lGvZ*x$;bdkAapW_k->}%VPrQ(hB7jYk>QMtU}PjCqZrwp zkv$mMlaVY&Ml&*ok!(iBGBS>l@r+DhWFjMbF*1pf$&5^4#KlMsBe{&^F_O~7-s1@G`Uw3KCX#KNM!zRQX(hIlFI}^}!CN4#ip*=~UzPdo5-XOXHiL!eUHPqGy z>gxTzP;HgFz9LXpokYDF3ykbpV2-=0(id{4SAQK64k!AIlAP?;tqV3*r!#P4KV$*V ztaP$lkZfEZXfxe)$Y!128>p@ghJ2NEM$>M`B6}o?1ln=^0iyRbR95*ybKG^6?wa~! ztL{SDkv(Z=c)g)H{<D(%=<|CTW`rthP*QH}*pU90QR)FKmD{tFzuM#X z`G9+Gpr+nmQ?LDYSJnhW!MT+c$u4>r3s2}-c!s~mU+1p(L(>Bll~t8BGoZN7Z`Al0 z7Mk9(P*O~lHQuTQpFcFy@Ag3hLlt#_>JW;i9`Sq)-uettK8a{KJ<;5?wN;f~y}kZ< z&;k@x$X#0*3e;3J8k{_XWea+i4SL-`S_S$aXsGl0L(l|2uo0*ODQc`GyXJW;KaOD7 zE-M%TXS8kUx^>vpP_S}FO$g*xSzqO^hTq8|FJh4?{T8Y7Cn~LLz)EY~^)n4-U%`@N zdz1{+&-B-6($%Z1sB+Ip*7Z7;$nH@BWH_f1rGed|cTlot-ogSyi7(vV8eM~daTpTy zb(OUlsP7`ts0<=^RlUEi277!)U7(@X;P``WQ3mFMk{Fa9Bjw0`Fssva=QAXn*biZ? zzplD6h;4)J!cH^bzr<2m8Kr#w+NwY!c1@@%peu?&{S8u&?~l4R5UdBWdHqmP%?zW= z_gH2`Mj03^^{7P|BKfg@x(tE*f^>WIiHG6{VUHMf|BkeSGiZI#ZE2SDFQgcrL1A#0 zreQomvT+$?)oyPfI4_hYt$KIe48LIjc%e6PaCT)aj1;Z$2^M(~$;M_NYl>yiX=YLz z+eQfmOAPCyM6kZG%1~I|hE&-ZR62hE==0C1#L?@nu1t=2-iZY=6)otmb!*m2FBe=v9@q)7Ay%mTf^(tL5IO$4%N7;lY9?H!cnAe zLXcctQoy6O1sSXl7=w-96AAa|2QqV};Kv~CP*N3XTdtWbPeY9lIIIew#Wf@_4vEI4 zh<|?SGJ`ku% zpHlb$Ql{ynKC4yvGKlJsC{2zibbqbC#^ z2Wbm{G_f1)%@F%R2sk{|h#*KU(bs9d2EU>Qn+-MFRNVF+sB_(QnnTi~&*ME>0}@Q@ z$J&hETdC95HZ?ETg0|?1RpXcjHws*xbccXngS6vF8ZA1EjUnCZs;mJ!RNI(YWE~dC zNiX89^JAx@YYon3upauut2x+E-cwoQt~2~h{xB>%BE787UjaiDESEMn7#(sr(q*O7 z`RDn)4fSphSm&f0YfvAB)VudX4GpiToM(_8i=>m&NmE=yKcRus7au`?J=l(<3(22= z1xKeBOv=A@_6!8c=!27cu~bn9HhFHKZgx-ee;Sfz$Rx!Q_Laf2QP~D8 zkRbtG8>-!zioFr(GPEMqiWE}@>K3FPpWbHFW!>4==eJ;JW(7Dg?s~UT=5j1EA-#-Y z(UOa>Koy$zbZ_x0EHoy)P>Ow{czQ=(i}ZV@(?hS}axO6lG908Eka$>M#OYJ(%}6yi zgGw8SSZxSq!QLHw8-b8|eGyMyoK z9c-vbo2tIs;W8FStU7nS*|QC zd^0257LI8fpx`%D!FmE3+%s@i<)7nE%HZdn0-IM>0uvy5PTG>U4$K~gDU62vhG50p z=M1BMXneqELR8b87J=aZM2P7-29cb@wKl>uj)K)z7YT+04$+Es49(XFHW^H)wz~2f z2s|Qqb_^lOkEZ_K0O+cFMk4TL;F))#eU&wd0ab@F$aLS_K$CZZJ6zP&X^uL^%VvN> z171d8E{2qi4iv12w*#t$9q6yo{5e>`*7&PH%|NLFwYUy2m~$Z5r0t6ibvRU2A27-d z#Bzn(FNaLj`N6Ddx|H(vgdqq}vSR?y+u&bULsZoR0W{nw&_esdFvM_gA44Bxf!g}Y z>dN_gpcbU7&D?2TgD?`|a<>nMZK{Bk9mE2XAyZ)wEL^r@h3jX6RrUql6(|+pC)Ky3 z5v5?qP#S9L0ub}73IuAC5*dr-cVJ}d62WfiODcwZCm>oMBeOH!5nTbcY(+byx5Tn4 zTAP-F7m;uQur)3Vtly+r;--7%V0XDwt?$1Ck|Wv6mU9fV8Yeb*=P_G+mY}G?2;OB7JU_-98|4XPx(&NlhDW>Fj0irdnaHL z)08U%P#30V8Z|%& zrh*G%gqwubh_>$zv!|n_GYDRx(bTnw)mzyhQ4?}Ro5S(Awv*A`AT$NNgZ%)gzTQUvRK%{@32a>rwZ8EMyxLktcd5}uPv`m!MD9IU`WHtUvcI|( zw){K+U!$RzXYVYZsG}N}6_8q?IdN_;ZpJ{C2}n4VCLx@M$i0V7|9mEq!3XdK<{BJc zh&cXTlcWc>sgSeG*otroLRRh?q|wekV7vbTr#Nr-0l66=eY?gfI%&PzeiJb^iJWFn;N7`1J@mV^?@KqJNNk0ONBeMCOww>m~%P-xW}uPXoH5(hvJ(X~Id? za4XiZGxnv2B#athuBi{8Jd((FAo9)(j((79{BtpcV|3l!2-`cT(7!oI(>pgL>S)PW z4MyBhxbGjfUt7a~vgwOa2;C;z{~#jojD1bEKQSsGyP_`H>_-r7XEY(L*+E#Z!*B~U z1VhP@*L%=Cjx{vxq^{|6E_k1bToBl7F(iV@kaP)p&&E$-bqjZ`I>USzOC*>fL)Hi^E9)x^ZQP2`yEN(>V3XUhRgjYku5nUx zUP92`esTXQp46O%n%OmwJO)g5XNG8! zz|{>^^_8_S9j2Dvn!BiHkHa>vwgZ^xS(9a#<&(B{O!kGgI@KpbqXIitu+4d@?`9-I z5eB~*YGWFJpxazg^$iLsrrLZB>sx-{YU-wKFj_%UrU13MeBchto6iH)1A zu#&6v!N!XhxA$PiNk!O9CFB~PSDZ^?!yH*Vdt{z_e3Du;scTIaEo_p8u`sj{*5pJJdgUbk0n%syqZP$=` z^sf)0_T4q8p4~hHvGM~!cVb@|!lfQOhA1_%bg3YP-m4kvItz;zZnJo@Ab3=m>I(KL z^@5hE8UgkR!bw(<<}7zxQ|p>TK*=Cxi+{oqRC;iF&AN3E#m6ZC6Iry)d&t>$S2aRF z$e3el5h<_(NPVK@ia#B6@ZjvD#l9sB46|zXpt1T6T)*0K_ZWX}lR;BM@f_^}~_g zHt62ujN?kq%E^{$GqbxMoIzv5z_b|g{JlBaalD$Kw?Z3`MmK~JvJZ9HaY)_0G(7M0 zAem_yg3tIT{DQBFzGT{tq-i;V&ip5!i4`?ii|&jTgfv8Z@IPiW;V5|n zuytpkb|7l?Hkuy{H+RP1c)DIg2eS4X>hNVIEkyw{cQoLX=~#u(mH!ADQcfV60?r-0 zfogDk2*S?$N3f8YhRpl%y;gKQV8hDq)5Fw8E$gwC;J>XFc=fM#F1&-0nxa*#p!VNZ zLG^4*@HF0PGaZ5G|Eycng;WQb3Wj8kM(Aw~@$G9&Iy5YrytT&8nCUnKulcu0We&Wi zko4G3MC`q_^N7-&tX^rX+MC)i^k7DWeOk?K>RHT&1WrMqeRdQ`1JGP?OykK!IvtVn zdL!wHU>Uh+I#(HP!dY0lpjYY4e0ZZZ`pe;oJasrs$aD^=*r2w+>7qnCtAH#vUD%E1 z@o1k+7n?4DG<^No7C4awk8A9C;?YLa1{0iPust%!@rHAUdKOL`bYt3R+Qj8-*nnqF zX~&bAE;ZfC?F zj$q^{Mvh_RI7Uujw~hfEKf9%1AHMm92XB_r1|aw8*mGIB2?4>Iy7BTq8&EF-Tl@;W2$GV)=@@mQuO z@pvpo4h=bD|FQG2w9~Wj;3hoe6VGOY(=6k7tXA3qai-^VM%2&%GRrvoafS9KEu7ia zP>JVsHdMmdpsis<+RxazpQd$jPU;*@BmW~u)2s3N`B1K9;U+jkbDEa%7D*g z=*n{PbK)(_bAxN(#MBkJRguLpIBPDqA_nIIt-_ON6Rlcee33g-V-mklwlinhcui6+ zK$;e5M@HfXBTzx&VTX3~*R<7;Y+h32f(EsQU6E+KG$;M2L(@yTgbxon!~dkKdmoP0 z>zm%a`?_BDks)WtKdF10$FSw54sF|(qP?TDax^Gf(f>w83k0{LVS(U(O0}Z#UOLqj zTd@t5`cRkUu_5R3|6I31q|FD1qb-Glzj`ayXF3PRLvMQe?aivD#o^Zf<0eCE~NSY(JqAAvau2b%uFdUX2>*FNYUd~Q$nqIS%S=2c@JLFvVk2$Lb7IU=&Uc9j%9%_aIATMO(B1SG|lnEnVQ)ylt~laf6og(} zfE?zRt)I6Rj=N7soo8N%sEy|N<^^Urg!3jwZe|2RHMeduA7~B%Djdam8zZ+P>K*^H z(jT(w+{eZru(r6Uq!^k5*9w62O9~1>xynkCVp?u)?^jF*n`6)*I3n~eM()N2-IEa0 z^w;lrb{-xBU!I@0UOS0CCHF(jhaq5}`l*^3075Y9K1S|Gzz1}|>{Dkv`iXX~e10Bu z=DfA}CD4~Coj=Zea=)0Tm`?@F(;0b)k%tlU5gpSr@Y5saXiSzB6oY=`m!cGsXV06@ zHDA;(=Edeq0JDpc#~67WF`v*er!DyU*sBj%TTotrBNVQ+0NldTGSIT^kPQDHjnE#^BB_g3?5=G)D8F!CHD z&oi=>kry_Z?=s&FxDd^Ik&%}W_vQa#&9lT$nV0C#d=!33em>k8kQ(!ko1f`dNY9#| zgT{c?y~@aI*qDUY4f}cTtyv4!mX+p#MTCo1k}CX)`7OBK$NVbj+$6AyU=!ca%p%xC zu#A^(Hot9t2N2&gzt6~>!)NCMf5)EsR?>I z+ge(~eb-c&kD6Jyy_&R&_R_1?S;RXqO3RFL$XVXr%6hc5!-t>u;33*Tf@^4CY!;yM zr}X_x^LPDr<@e?vK=3~@@*X4aqu4*t^?jelPoA5lkIm8&ZES*iq)iFGiyUJ1HEWB+ z+@Y(-N2nPo^{ARS>6U8}0d`Rm@nQ*4X5^DD(Za}Q83Aq4se4_YhMdvuy4t&X;X`gJ z-6aQJzfau5WH2~L906zFi-W}>;%?$lahN!qkeFOWkOI2jAn7{^1t=2`r+PM3#2yrAqn#ZM?Mq`25QmMC743NEmf;Y=)eX820|yhs z!_)5bau2x+O&ZG+(=8uvh3+=v>O>XqkOSA6_iOV z5lh7~v7C{g82OozUl{pyleo9Ik2p<)W4eE1o7CC(sAH;XgHN^zDrTdZQ_Pe%S?ze!g#oYgNRxrmbWC zAvHl)q|Q}a*gC(ibdGEJEZ3SPMf1aTaaS9bNiwEK8Xc5EW z5^<@xOpGupGAc1DGpaCZVbr=sTrReXE5tT2Dz-CfW7N*5lhMJ94q2cyTB zcm#IP;fxOG5|3nbAU4SnUJW6MmIVJkn72@Ojunps@IgBGVd4qhh^9X}Nw3!cJykp{ zQw`1(&&vGbT=9HvV3&9vqr^cdWp5b9hsQKE$9CSK0yNJd97x;vwLFuEtBS&WWmbPS`}my1`zwTIbUws@_0op`-?12>k@ zv2f=h+~&yWI7Y`aI)TxN@Xew|ee()-(B?h3V1MZVw>VOqZD|B8hU%i)u;iY)UH`umey^17KXVIMZM5~WJ`=y{t2JMX--zEbTEb{4qi`u%_H-SI+dr#8OPVzL@h9=OzRLeD{vrO! z=u}4cW^^AcuU|XF)lKb-4T+b;K42tCk|i*o`!c#8qtgM#n2{1K+A29Xi{z9B;H`@- zkTV?^K$kBzE}tiq7fj~8_t~*a=dTtehjYZpQDetV&MzuWT+b>i7OTw;mn$a3s^7c_ zw$R-H*G4SvgiA@`T2`ydHwHVKn;}9OZh2wAKxNQw!~3|*wR`XoRZvacLx;h&sW^7ssLO;p}}rh@I(IO3%_CP=3b!oUXLVQyiCBZxc7R1Y_4~z(-enu;{ zNPCjgrP0zDaymJk(HRU4;!H;2-j&tx4=u}>ZJU7lHSJ*4w?hPM0nvnQBOy_+V+~GA z+o8m$qehuDI$NbFFg9IM4vqx8{!5F4RUbbLJUGZ3M5*OT`MQ9@-BKPVEjjC>Elq2( znmV!yrxxU8)mA${*KD&?Oe(rKyUMFA`sZ>|afOzMbeSlduIA=S)42n=M!XY;X~{>B zi1Z2MAE_`W*QiBs&+GnZz>_yON;7qDG4TI~u`x5}-yX)6W=jyv?3St|xc+&6M(etz zfKfVcZO3=yH*azQ4d}aJ()zNwL_yE zx^}G#q8!B~>!)O`&4(*?Ar1;5DJ{mafAo)>FAd=xB*A5QS4zvJR%wOQCPk%o>0l`) z#ib6ZlhFehUC8KxjD{Em=`}IBn9*iNTNn*9y5vf@ux>1L)FIMZ__l*^V>2}aQ> z6f^YQQbyafKW=377Iby*XB5Jq;7q}5H?a0-GA_Z6S82;|7{$=U;Iind8n}}i5?o+a zs<&Co=72-u;8XI}@{G1ObVT5O#Wijab@Jjv9WDul&vZWyZ@h#%!eJ@h0w5ap0k}#x zZn}np&ibtgW=go>rjL4%ZJi4^BCzsg zmm}#4ByHQE%}fUA)zXa+XOymyu9dEnu9t3LG|Ff@qX#n@V>G^5x=FfOx<$HGx{c8e zMvrIod`4jjq;0}v={bndX3SDd%0CCDay?XHq?j5Pj;BbBoupCyKxjRbjLL*tk|kl% z>ZeHB9q~r%?voycxm3DedO&(mdPsU$dW2C>_mzyo4fHT&u3_|$Ez)DsO zjIM=??HD}*mH61io%GnJX)DxteJmWteoq(#xa1vge}^xOZ7?JVIY+}c`UUVtlnJy1 z0xz)Q_P60W4lXc9^-DG_qY_UTk}$)`5<284ti-FOhj+%4&k|@xqhFR@g~hJ)3Zv_~ zq}Lc-j}{Qw(;WV|TjSp#eoJ}>Rr75|5ABj*ZE~1e-p3L^`cQ(acsG*O(#O&#Dhzd% zQMOU~1pkM>^naRC_sSBeh1Kd>+*Zj$6IE0Kan{njg7rqATl!A=A;s;#7(G&5WbpR0 z^lOT@-xxhAnQScmDg6zPz|(2#k~v0?PCk)&*#u8yfze~SH0F@45!=d;)HYRRMYbmS zkRkALT#^sjDG$g9C&+_kaM3Q8hse9hL*-%eaCwA0QXVCPqjmzLCo*~xqbDaXVS{?(x$I9d2=LA%-GZ{UL(X;W-a~Rx`2*1xmhH-uBkHw;~o}JuF z?*;&6^3G78#_K`xyQDH{?@wVdv|Dk{8r}07f?p(V#MKoL6f#jX35TTc-Eg4Q6}cxj z;Hty3B>jw7w6h%w^z87G(!%w6L{Kg=LPikckxSD*Ox4obHP=m^mi}P6{vn|ivR9r3 zV_Npfez`)PAw3{hG72G`3mLtL(TlageaRM(Zxu{h*>XUxMWI3rb`}1n{Q*>|L zzZ%{W!ceZiZDk}DZNu=0y9J2iaeX}oUWVQ!VR3DjyoAxs5b#U45C`V1E?u&uJe*$` zE^Atx*Sqtz(e9*hGfqEtTWgOYh&DM6fo(Y|w}ZugfYB=%y-KszD>uooMEBzIBEt1r^^ts?3T}v!6Mwm=*`^_N5sJ4 z04%wuHgtRFD*7>cgdX~TWRfB=DWyF%s<=?T7|rRa=!M9aFnX(6u6J!Wsn{rQlsC!H zw=m7$$>=>vw?n>6zB1jHkgt-jX7qMO??4Hm7nc+*dOX?F*XO1C7xE4A%^AgSk#A-6 zE=KRxBd{r7DSP_K%Q8ydCEuG-@;(`y%6l2T&!{-*gXtBwPuGfrEbtO;^z`ea%foFo zkydS_RX4?!hhv5;9+jU*3;vk=xcr3tr2LfpwET?xto$6K4>I}?qYpC*t^!0IA7k`! zMxS8x$;;)f@(a)_aCfu(iu|hl8hQ&)G5RhHPW=XFo-lq0<9A25VZOfKr0XJv6!n&B zmI9b-YiWwLptFemrauA&No-!}pM#x?;Wd!({Ir73K~Mtx*{06c4sFz6%h8hzFYa8r zG#pEFh_e!8wRndDyob@&Q3r=`hU4&uaqGDg>o$ra(u?xP@+b1AV3wrBy~jh$#6 z)&+rA@M@lUN&ZFt6{`D9{$2h<{!{)-{#)Tda}A%&h@KyqT7#h@uTiXMinOJ^#)%Mi zDOLxT7-dt>7=4vd(4IFKeU{Nzz#u1$U2=BCO_!YHqDGr5!!1?OrEy;rE7HcI!jq-l zilCSneV);m@M3XAQe@7eD2hd~&QI0Ypz*@!Rz_c7^hLP+LhH(`v`fmfrb37$uXt)f zAx25eT0BK@Dg(e2gC3>is9SmsueK=?>sAJ0oMoFd23Lc*@rsqvmvIEp7t`m3L5KaV z|M!A++xtPv2xTM(OA2sE;hh+G{msY>gd;5AMW;MZX=y=8VUerMS6=Qa@)r7C?xONi zm$$-KQBv;n=lMMOdIKQ-+4q}i-O6a>yRVnl^pe@iSh&{)nx4@mDLG{7Q@1h>;dYol zL$8$ypxHl~&f{XH^B8>#_3>?$)4O;I+!`-`frEj-+zK%+B~QuMr{kn{WGs0z$6vQn zfP7($U`NRH8j6%++|J&9k#3~~(RYM2VM~=V1@@x5lyXMj>r(b+^nIMN#_1*?vE1*^ z3K_LYc)4+^Eb@W-8$AeZ=U;jDE6FnGM=k&FH6^ z_Wh0X!d@BGYO_EPA`ERywLg84X7qKMz)--PIV6)d;SBfuenvRDBHR(vy&xqBeW%nj z`WcQ){l!ORt`g#ME>-3!jmmswfpUPdP=QFw=Zr!hf63@qjDF4NH;jIJsj^6EQWh)C z@PAkVU+OzXzi0FZMt|4-{lVy;YWV@^#A84h?cM^NM~!=MBm2`;m;*9&8n*(#Tp4z% zk7px|Xa3b-W8)x|lxbODJZq?{0!3?%uE^0|t;=cYz=eE{F=v47N;tsCsv(Ypl{h#< z+}EnVi~CIVs*BPru(C>7ty$o;jQ+~#zYK%RzUh)QzDtWhD`)8u=)ZQ+TEY@b zITsc7JjQb%%?uZ`yc9C=N+BQDa6y%elx}dnm5Y^2lnqK3<0<2L#tV!$ZBjNWo5<

s(})c{xmvjatGh`&UkSo_`i?|wF;7ibT4@192mGb?`w%Rn!{Vyv`P=|^0b?(-^Jm6tLKy{x># z_yLR`20A&H_9%z>`b+0$2MIR45n z%I_Ja{!sp8{7A-+GFDcG6+uOT{HBa1S*V52SYlbs76{L5BlvHzabqnG&Tau|?Fk+^ zp9R5xel%9Lof!Gz(-MNQ>}DC$Ge#bRD0#mzatM$w?hzxewv4w-kg6?vStenO+~UIC zfW>TA2*s{O^lkYATS5U|Jqbi%nV{N&oP8DuQWwD*eH;`UgYW zTP-i5GMtKm7|TnHpJ@#BS0NB%dCl^==Ev6ROlx}wEatdbU8fz>gDQ6RPg5tfG&;T3*=Bf|3J6;_+o zZguDZ7V9AEVCxXH24Fa0LwI>A#sb>-IODgbZOyjP_q2~l<~`OEDdV! zTnw3;xXIpEzfqiG0TlcrtaoJWd$ zI^ViL{>!=$JPf{t@gelx`2(T(={|18N<)upq(UCaZ9!dDO=Rgt>tbuO70?zjzKQXR zQ!c;d3@x$%&DJ6d36Ea-SdTZT8Q)r?I&HK5ZF&?U5qz+AXs$jVPPqF2opV6IwDmIM zkn*>!1wk;{8Eb|V1@zXEnJCr{Z5_btIf&N7P{&lpAEdeTLsFY-`T6)3gXYsGLwVLC zxtR56`AfzF2;*CO2jHwnVgSy1qUk&&=)kBMzaqWgPqv<7^n0A~u=$thcfA+S#9lnh zdbaf(#=`{M&iI3Ou@}4bUX1NvFJ{DBtXHPRTlmiOc#HKql-JSN_T-w~dXp6nE9$o1 z490+m$klt@*4wOLOJQBJMlD~ctz?WO_c8naz3De&c->>YAIsefmV!S7q7~iN2dob= zel6oKf;Vs6xV_s3k!OSaQ7bG0Hd-IEK5l)2@#`4Bp7Donv_1v4;~B=oF-TxLF8D9R zEvzp>Zj=?K8Z|keSYNfi3uejsn)P+-8`d|iZ&}~AzQcIN_`?|we$A1LKZ@}nwqq`} zzGr>k`hoRB>qpj)t)DRdSjK~Qa}wjB%g<%}d5k~*e_z;QTSoGG>(6K;`+A+v`iu2f zFp|GB{&)tL!Gn=JQ8$t!hA(%2uf1ysLkv=E=B+I+fERr7)~5{>8?jOOFD`~A@+`)~ z9`GBWiDZ>FQfwkbH*AtkW;{56@NS*!8{<#yvN;%k8XEb5ZCYjwEO#+( z9BR`dI=gS@*bvP*v<#ZI!lJjNiccF2;jxdx-Ji0YaSO z5mc{9siuXov6u&=_5za08%zJFPx ztE$?yva_+r>t42lY^^vVVbyw7mu&^(uf{GIo_wond#`)hVzyNfE3?II9kxyzc)-^( z{yN5A&-fcQ*;d=u*bcG540I#oZ({t-jKA%_@VXbgP+nLH-Uhybt&fHy(YzgHgBjx% z#@~waNWHL?_8OO=O()n+)V=d``+17(RKwMHfbn-^x*E2#z}2vwZ9B&Xlg^!tzlZVn z;SkX`$UxsOgcvdE_}$um*pM_WPQ9z>RFi2E`WLA-NwlxCe#4 zr)9fRw}P;u(IUwI?H4a0?poU!UzXJ#i^6M-@S+Q5`9tyt9Cx1KWcD24J;Tr`Nu_z6 zwkvgG_n_Xrx1grq%6NEt9Prb_YmoT>0K^)}pR2VYTb;ORv_h*liiKf7ro`7|Hlo zkoMqrGiV3dA$RQx`(XPJ`)>B3_F?wn_7V1x_EGlT8UGsNUuQf>>rKYL#dufrOlEq!mD!ae{dyXm!7wpDbtw!#)c zINYX%7c!HDx0lHcX*&R=y_Xj5yS8n%sH~)@ys)^$>nbRLW)=C$D_ov}Jija7Tj+6D zl;)TFywIW)w>{I;^^lv+Bvk55vZuY^Nj)T^}hO>#jePeI6!;E`{eTBWv z9<{gI54MA3>>c(_JIubHGX68hf6n+X7!S4pHh32^{%gj6!}xEnfc&7b_CxGz?d$C8 z?T{#MSM7;JdHy@bf6w?|nUKwd$*{B#rZB;Up1}WLmi&J-{~dG?eQ?}w!;Rw16L7V) ziv48!sbCiEr!fA9F8gVW*ItD0CpF%F7T8Mr*>+fV{>b>BQ?~Ma`$g&YkIc7Ug8Lgk zq4`sv%P@Z%?OS?~UWTNIZ`_=Yq?BH+x#`xbE|HnrA^_HL=T&+JD zU&@5R*nQg#vtuAABi9!E>mA%dvEOcoxpa&D4*Q+~pWj{-zzG8yoF!+26KxF+pMiEW7W;&u`g3&_2Ug zidqiY>CUu_sd`8QHsZ(jPwihotjGSD{VgU~piDQG*2`kAJMn-C*hPlqlB~q8McNv$ zpcoF&fsCf)8qof|{a>jz{m2A+s!hMx;RRWvO}{h2k@Se{e>pgK1a08&?Q%eOr#8eK zg2N1t9400V=+YQNuC_Pe92N)o3JK9V>`WMxWWzDQF)$-w?ik|O6SjpMyV>t_408;3 zjBt!}jB@Pm*n3BvsE4~V z0ZQ$Oe`YaZH2xl=u?tgVpLy>8>$iop4lXG#O(eEE(i7Vq>51)*w8VBtdSbgHGqK&_ zb@)*WG*jrPV8YnMOy#JAZ6U`j$81Lx6UH%N0u%O1+CE3XQI~Ge*r{4v}DlU=KyEmUM5WH1NR`u3K%Kd|F8FbsXV1(s2}8Qn2v;?!C*gY1G ze$jL9eeW6LeShQq{qv3QpX@O*R+72)o>_A}&wS=wTmr<80P!b40{#oyLzh4Y)leM* zCqUMyfjA8EFM$4c2>;J_p+|ngcF5ZQ5w=4oe!_N$T4?waw&(0tEAG@9)c=c)`nTi- zbm~8n7m$$uOkO}0YS;~J`SFncy*Gs(gQ~0A*wEty$T~LkBmuJi$4dJDOK=H23q7y? ziof!m&b0MZ=wGqX%GDbRg?Bm zb>vj9kWoK^%a7!>I!xqBSl>J|x98Z9#H82146QOM#6Ty05;2gVzf3Yy-*T9G zZAw%d@^>P}#p@^Uy!zjJ4wx0p{wEOwvw_+ECFz4~B|wsYNcvz7Fvo>WF!f59LV#@l zL4rZ{{P3fng<(1oWcQD;d4G$mupO{;wIML|kL~?mi1lC@Fm>0c|2Sp^mI=eE zKmU_Qf@KpR`~NkM+#mDEgXI$-2MCa?|C&b;tmJRDy@i$i;E^Cdi-9xJ{x%N+tnzPT z=V59#7bHNiKjx7l|2g)*X~Y4mgVo3Xlqmn~#bLO>Y=PYZ_XR!+0yNAuY&1MH{53Xc zL~F!rY*81uVKmY-c53X>C{a=)U?$M)Wm2OX;x{{H7{uXt~sv-YPoB9s1B8s?K#?Ej7IcsHrt$-B{f;-5t8= zy1R90y8XI?x^Imf>>2C@Yz}S?cZR#c-QiwvAGjYp6`l^y zg#Q93!Q0?H@ILqedj5pskQaSU++aSCw}aT{?DaUbyr@dWV{@e%PE@fGn6xd6Ecsewcx4Ur(y z7-@nuLpmW{k*krONN=PsG7K4kj6y~uHzVVa+mSnwyO4X3=aIi5A0i(kXOYj4FOVOQ ze;_|2zaqcsEzq;m+p1TqC(%2ucS`S!-g&)?dYAPc>%G!@ulG^!linBoW%}Csy81AE zeSHIcLw!)+M&D0AO+Q0FN54?NQomNePQO9FNxwy(s^6~Pq0iCh=}+n_^iSzO(x20R zqyJ9-BWf86jsj6uC>xX=$^qq!@J;h>>OAT<)GX>5>IG^J^&0gS_1<8i!D54@1{wz122cZpfu4bnL4rY zumr3DTfiQ01e^g^U^Uy(!gaeVlMj#s448#EmKq9aeNC7ZF z8n6RM2X+H{fqlRMAPdL_a)3Ob04M_RKq*iT90DqUN}w930Z2eS&&8Mq2u z2mS%v1a1L$fP27w;34oBm<65zFMv7VHSiXA4}1hZ0bhW5;5)boTmmi!wLo1E4(fph zAOISHCZIWJ3EF`6pcCi{x`SSzFX#^jf+65~FdU2mqrq4(0Zal@z-{0Ta2L22+z)1f zI4}<^1o2=QcnJIjtOjerdXNk@fvsRWNCTN58|(r5z(H^ry^nU$DTnpK;Pm`#{T%&wW; zF}r8J%p7KpFn2KbF!wUYnC~&qFejQ*%$v-o%#WF$Fn?q|Xa3p(YO%rsu<)`7vTGU!JS+rP8Ssb%CVe!=Bt;PFQdaI09tz5NX)#g=ktM;wRU6sG8XVvhk(N&jL z-CT9+M@^=smZgKGhozTgjOA9#6w4~hMoWrizoo!(%<{D570YXu?=And{BC7vWoBhz z6=oG<6>C*uRcTdi#j@(R8nilNb=B&+HO$)38nh0u4zmuo-fx{}U0_YI?y#m=Pgu*X zmDZ1~Us=Dg(Xm0X*=3VulWo&(!?x+RxoUIU=B~}W?GoE%wzjrzw(hp^ zwiw$q+eX_q+YZ}l+vBz;ZD(!Y*uJxa*%{h_c9C}Rc3bSq?5gc*>?C$dyQ6l`?B3aZ zut(T~_D1$=?Kjv**yq`o*&nnYus>oiwExxqzWqaor4CRBxP!feyMw0##$k^`hC`DB z&4J-?(&3WB6^C~Y^A6t}t<@)Rxj7~~raSI-taEH}q&iMH9&5}Y{?y}pZ-$mdu=JLVio9hBsFV{fVVApC_vg={jldhLsuehynGj%g} z+wF#R!?}svWNwPpi&tx})?MwpI%M^_)upSeRufmtSD#va#vSUu!X0prbdPu6;@;#= zb7#0;cK^-&wugy_jfb7b4v+mFnI1zP;~ock!mE~3FRqVy{5_*ZezIsEvmwHEd$9X4sQ@lI8Y2K&3uXtbcf%>fQ z0eoV7w)&*_)cQ2}wD?^0x$Se;*Vxy}*Txs)yT>=fm+L#~EAXB5edGJiFWN83FWIln zugj0)chB#s-}5ytYkb!DtvR@+W({f0nKf6}T=z%%qy3HjbNoyE%lzg3r~J*sl z6tpmCaZp51Tu?#~BZwQ+AM`nRQ7|NUYw*tCUBSb_qF`~zq7bbRosjg9%n)qIOvs6l zQ=$5y#-S#m>7kjS*wC5K6QQTpX|K~?XRt17UE#Xob+^|&UN^fwY<?tSbx}D*dJk^H~4J`-LQT`Rr@_jS(B;HYRNB+BmS0xAEP^`HkN;g=~u2v}x1erm;=q(K^wn=oQh~ z(Z$gv(PyKtMc;^Vi1CQ=ia8il6GMu*7IP=&-e#lCmYc0NZ{NIc^MTFW&7+$Iu{yD+ z*cGvXEJVBS7j>O*+pC!IX@=RKr6qMAIL`z~MJxzL>^nUB6t%+N=Zsl*4Y?UVKCL1Ih zCTAq)B6nTAcvNxPZ$B<*S1^R&6`yMFYJ++MJ~c!yxe%ntbu<&I-J-FB|s8MHHG=lb-9 z^v-m8Iy0TU3*2SB%XXLjE~nkZ-7UMRyW4lu_T1g`V$a;3*L&V&1Y|^JY|Mzxh|Tyl z<8j7p#B-^jk1eJlG> z_N(kqxFtAU92}>IGr$2jbDSm424{zJ#5v=#Aqxt?=3=YGzkoY|b`Iq!4+$oY~ppYuI;VXkH_ zD%U*MG1nz`b*^WwPwtxBu-u5;jk(devAGGkiMcy+_vdEj73Wpt)#bJ1vGWG=hV%G& zV|k)HS)MZQSl)@e(|Kp}uI1gyo6Y->_bq>6J|urxzGgl$AC+&I59S-^o8;T%d*plP z`{f7Z2jz$4$K=Q6$LA;JpU%IL|1kea{a=T7W3fFEA)@ zE7(-fP{1xYQE;!|X~DCCmjxdR7ZolkTwbVEs9Ojtv@dio3@VH$+*lY>7+1KZFs*QB z;qJnW!UKg_g~f$cg{;Ekg%=9%6h0|@Tlk^yQ{mUbZ$%4>AVtt3plDT*bCGXRSkZ=} z@S@0~q@t9fZACkZb`|X@$}1`;Dk>@|nl1WJyr_6d@$zD=V%=hRv0kxhu|=^}v2C$K zv2(Fov3qe?@s8sBVnQ*wm{B}ke7yKX@#*3##rKMz6u&I~Qv4@=0e&%lDSkN~z?AAk?SZ^B38WAL%~H2ik_4tzQuhtI)0{6TyJz5~z2OYl>88D5D$ zhChivgFlbIgujY^f`5j8fuF;_#=paV#DB)m2rGW)WvWz}WmGHMy8Y_v>NCMlaLla(DWJ5_eJ>_XY4 zvYTbM%I=rFD*IUWxop1dd->9GjdJaBXgRzbC^ss%DfcK}Q@*x5xO`oCRC#oHY(+b-PmkN)H4HXd;aTQxCk}8rb(kqH9N-GXlR8&+|)Kriv z8Y;*Yhbx*ZS}QmeJr&%FfnPpXF0It6)UAY9qACq5(Ur!P7L_)Y9+iQWA(iVZ!z-gI zqbrjuF_meRJ1cip?ycNc*-$C1{JqMsD!3}OYIjv`6{)JBic-~FMXl z{Z+gwW!15&6IG|H&Q)Ekx>9w$>es5@s_s<%UiF}Az8YE$R!3B0stcN6&(-tQ--rkzNHigu6D^6>M0cVO(U0g)3?_yW!-(O;SYjG+7jX|UgP29k zCgu|JiRHvPB9+)dq!U?04zZWWCyo(CLwU++-wT)(D1ygsTvx<0l( zp+2cTr9Pv6e|=Uxu0FTEpuV`iq@GqkUVowfS;LYBM1x@ix?yF5S%Xc3eS>3zOM_cO zM8m;`frcXu;|<~lX~T(z>kTg(UN!1Af{hl9R*kle4vo%@-i>~Z{*8f+A&u)AQyZ%q zn;Kgi+Z$<(%*L+9BaN~~d849H)p)V-O5^p$UmI^V-f4W^_@eP;<16w~GLpQ443dq> z=HyjmE3yqaf}BAvAQzKM$p^_5?>5gi ze`x;H{I&Vd7S|TvmY9}=mIE#MEnO|WEf-s!w!CPWYkAZ1u4TUEd+VasC9S%xUaf0d z_q1lWQd?=Qiq`Y3ms+p3-e|qqdW#C7!l`;x11dl@qOPP`P+h2AR9~t;HIN!cji7F% z#!zFa2dQn;QL30KrOr?l)brHa)O*wi)W_7P)ECrO)VFO5+aPVr+BDmA+F)(SHdNb+ zwpDE|ZINwhZKZ9UZQQntZMWO*wcT%f)b^z9Y1_Bfm(rcJz1fI)oh)9g`i?9r6xk$C-`?9djL@I+t|ncEUULIt@C3PV>%Hoz|Up zoerH&ol%|pIvYBs-adAjpL=jG08oi{okc0TQV-ubfgZRdy1Pn}H2gtx;fo~Zb^5e z`_lvIA@ue1aC#Iyk)BLXrKiz%(09@I&CfqN^f&bP^grld=zr3`GZrzHFqSd&7zPZ0VZ<2vL&}(D+-5vu z{K5Fb_>;MSxtO_>slh}s4Vh@>N~S5(f@#ULX1X)In7&MZW*{?|8O@AkCNPtjDNGD= zAG45I&OF5Yg;~vPU{aXPOe(XTIm(=3%9u*#G3H6;Y32>)P3CRpJ>~=EBj#J?2j(Z{ zSLQd?0+tR7#zL}CEJGH^a%TmxLRn#~2-ZecG%J;bVQph=XH~KevwB#4tU=Z=i_aQk ziC7ZW6idds%(}|D!Me%1&AQ9F&w9jq!g|Jf(Y34#>~iYz?@H*}*Hzs`>pIdU?V9S6 zb)D=w)pfS(TG#cie{}ucb-(LT*Id`DuD4y^*^Agq*vr{kYGDbAZNxTVo3kz1)@*mS z58IFJ&kkm1U+1>0RwuC*y zRBtUpQ5qCQd7-okQa=IbED#j*v6KndD4!j&e?L zPIJz2E^z+A`Hgdj^E+pb^Jn*h?#10p)h*1lyP@5PZqsgyZmVwFZijB?ZntiaZm;f* z-O1hQ-Fv$Cb!T>GcNce;b|35}bXRs)caytm-M!tD-P7IjZdLd3?o-`gdmuepJ-R*c z9=#re9*Z8U9@`#=9-p2yJ!^Y{d!l<{dlGt*dUo~X^yK#x_27H%_k8SK*=yhH*z4Tu z*6Y_B&>Pen+MC*&)r;%R?Jejn?rrLA>22%n>}B*G=^gJC_ey(bdKJB=doT4~?Y+@^ zv-fuIv)-4zuY2Ed7jPGImvS|@D6SzF&0Wd0<9cy@x&GX>+$3%a7sK7o-N`+`#d34F z`P>RFkxSw>aGSWT+;(m!x1T%Ao#e{6O71c4Y3@1hMeb$pE$&n9YwkPlNABmo1$~SA zmiB4%Y4v&bZR*?8m))1!SI}3~SJl_j*VfnB$LQ+a+B4fKioqn74q=BQr-Yh#8dH( z^G@;3@-FZ$^RDsk^B(bLdCz%syf?h}ypKbOA;+NuLx+aAL$aZhLuZE04_z9%HS}=k z&CvUyKZd>x{W3$f=RDBNs+4jRub_{01od?8=Nm-1)$ z3ciYemj5gN7XL2)KK~K_3I9F+5B_KVJpa33p+Hjr6(9uq0t11Cz(!yva1gi(+y!0& zA3?AnS`aVTB1jTo1ltAag53hFpj2>J&?0CPbP5=PE6 z#)M-NW0PYS#x9Rt9lJ4hbL{rmy|D*lkH==mo{zm0E)(hrZG`qhC!wp*UFaqB75WPU zg(1TA!W7{);dWuVaF1}GFjJT<%oXMfi-dULFG7;AK}Zoc3#r0xp;#yt&IlF4qrwxy z)53GYi^40y>%!;4IpJ&JJK;y+XW_i?`}o3f$oR5xjd8Pa_wm4S+<4{q*!c1BYvT{b zzlpR&x+1tpPh=o66gh}IM7|<_QJ^ST6fKGuZ4o7jFrqZkPSGw=mZ(H@NK_%J6xE9A zM2#Yfs6)gR4U71qF_B0#Es~2=qT`~IqUWOT6Dud|C%h;8CITjcCPF8|CL$&hCz2;H z6Wb?tPVAo8JF#zqFhQB%OeiK^i}l2&VhgdA*jDTyb`txE1H?h%P;rlM)ah14Q+#%+QdEybVKr9kV#8cuK@g?!B_=EV9_^bGvWT9lS1SUaB zP!dB4T4F4*lQ>FTB&#K!5^u>m$p%TJWRqmGBu;{rlu8atDkN2s8VO0#CTW*+NNAFN ziBvKpQAmzTPDoBm&Pgsxu1Ky+o=Toe<|J<Z<7lr7f%{bx=yZ}jGxS$ zBup|Uk4&DLygYej^7`c6$$OIzCSOdxoP0I;Y4Y>rymX0lsZ>LXk{U|U(v?y(sfE-* zx?1Wf^^vZT21p~NG16FRymYHHRhlNA)6l9oviN(s_xX|1$g+9++4_DBb$Jn69X zh;&>kmQG4l(u>k-(tk*Qliriwmp+s}o{F2=K9x6BIE9}on>sZ0%T)DL?Nt2~d5SaD zJJmlmI5j-QpBkGIO-ZJtQ`1u?r+%M$HNA8iK5aD}K8=~iO;=1;O%ta{(+$(y>HcZn z^vJYe`uOyz>9f-prY}!ln^`skn=zOHW{hS`X3S@tXWV8yX1r&7XToM8W;V{m%wT4= z&!o@nnaQ0wH1o?$^-RsopE8upPzK73WhOEknZ3+O<|+%21<68XVX_EWlq_FXA*+(r z$m(Q`GK!2L>yh=z24%xCp=?4nDVvtbWG7{3WanjqJVBl$PnKikY4Qwtj=V%pkvGe!@(wv& z&XV`bN99N4<8rZFDnBVdBR?;{B)=p7UH(x1ME+j>hy08DPlbj8r7%>W6~+oXg@eLL z;i~Xe_$vYxA&L}5h9XCiuP9QKD9RN?1xeAMpeULZt%_lVSaD2oUU5lrRdGXcQ}ICY zNHME;u6U_?A*Y#hos_Xv;!+6Vl diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate b/Demos/TwitterLike/TwitterLike.xcodeproj/project.xcworkspace/xcuserdata/stefan.xcuserdatad/UserInterfaceState.xcuserstate deleted file mode 100644 index c16ec01fbfe5314eab85ae5dce51d3a3a8c5a266..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 37374 zcmc(|2VfIN(?5KB(iIuo7)dmPvB4E^$Jjt9mL=I1wk0FUy$IQsdsT6_xk~~`2nh+K zha~hsdhdmh-Wwskkls7#vokz*`2kGP4L(nf)l z2!>z@6`>}k5=lfdkwT;ri-!cFuN1H>?KDzSmsM4U&QPh3G(9 zW4W$Q*JtSwI$&7P6QuBP&T8SwlL= zMzV!$C%Z^D*+ce|LnKF@Ms6U_A~%tn$t~oC?zr^vKM48%MQz4m%Sx>SN6W_BiX02FJxcKzLWhZ z`&ssz>`yr%m&s|lLLMleELX~>%4f)D$>+%D%A@45@&)n)d9r+wJYBw2zFfXao+a1I zbLDw*qkN6rDld_j%d6yT<+bv9d6T?V-XV9&J@Q`pfP7fa%TJe|A>SxJM}D4stNbGQ zrSfg^tK>W7d*u7%*UE2@-z>jPey98%`Tg<(@`vS*$)A)zBY$50lKd6m@1)4sWPgZs-P;VDyo`lrdp_0s*UQS`l$ix4C+kkENUZlHnoX5hdP(K zjJllKMqNSeqOPX)QTI^yQuk5!Qx8xNQU|Dqs7I(Ls3)nXsOP9d)GO5M)Em@W)Z5e% z>J#cy>NDzZnxGL)(lT03Q#4I8G)pV!0D2M~NC(l==^6A)I+UJA$I}UPBArAh(2>sJ^jY*d^ttp! z^u_cg^riG=^i}jOdN+L+eK&m%eJ_0&BAF;=0h7$6FpHU`%nD{Dlf`5+s~Hnx zVM>?^#?I6*jZ72cV%&^}>1O(wP0TsWxy)wfJm!363$vBEfZ5LMV0JRQnElL+%&p9w z%)QKg%mL;h<{dlu?jYT zox}#RN>;^AXT#VzY$Usojb{_s#cVp8!LDGl*wt(vo6lO=BG%5tH=>H`~MZ zvVCknJHYbnsqC5TS?pH!0`@}oB6b_QlikPOz}~_hWFKZ9VIO55V;^Tlus^a#*`L^-*Ay+Vp07ZymnqrP3ToIv&Q_NQ^ zP^2mrDbf_n6)O}gi=x^+t*tK;3L=1*L%c$mbP?}RP!`q9+7x0F`bw}%p^jIS;TB2jF>}&6A{E* zj^b#J;aE<=1#pwNKrV<2<|bcDL=sU%G!a9@5^=0B?WnVbgz6mic2BEYU)SXBa9Z5( z)Ro=gEHdZ2Y$4Nijv7xxLsNT0NmF}WM^Bcc(cazE;j9z@9G2QfN1Fqn#jj>hyUyWq zH?`Z{Fn8HPlJo5@x3;6Lv(*7r72+w)xu!Y1Ok5J=s zIow*i+uqvIAT>3gFcOJ7hyrf<4#LERaxpIxW*86_!b%ho#dt{6KsQyuU#FuLy0zQE z5!_5}hAqTV-_+_@mXwrKY$QCThy#dhfaQt_k1Rb;e4NAHB6t4fU) zli(>y4YLuoMB*-DEnz2WxLMq6E^HT3M>vRjZVoq>n}>UD4)mF=FyCOY+Vnbu)nv9= z^!a+N)nGE(^7Li4kce>v#RiKZD_?I0Dv@M7hQ72=W3-H5yd;>HR-%0e(Z+>y5w?)o zMFz8@%hTj^)ae}EP0(@nPJ2yLYm>Xl;SyWhML0q58mH6Vx0C21sz6-_29o0=l853W z29_*=PZ>*=4h@Oe9-?Ol(alA2(c|yAyNE%IDE_>T z;3~a8TO96P#5#f}sz9pnMIV$Igd)QT8Lvv8ld9fO>_x^EFVU5q6-w$-3?l83yJp|ry^;g6S}p- z30lH0mmgQ+`t%F_yTif6g>y?_i zlh}==zl%%WLG0mDaEqqsimevRH6Duwx1$Xd4NrUfiT<6$HN>@CDz}7-k^pWXZYGpF zi5rQVxJ6vrPU05gR&Ftu&Sg{qjG+!}ZBu=d!)Xf%f$tcxz~0c_15Zm=Q9&b-@ zE4YY5#M8tx#Iw-W=ZNQt7l;?jT!OqoiObwgZ7^Bc+d3=iMr04hgv;bsaVvRL@_%aJ zMin$EQge^}+`I2N+dKKZLcER**J0vS;x$ggWpUbF#2dt$#9N$>({tHeOtIMC#iD}Q zLgpP)8a}#oY>`#?7-Ug=A7b%+#N}`iQm=eUd_yGeB|alQC%z!QB)%fP=5jd$x0=i2 z^0|V&#J9wE;E_ZVKN8WLkuz~-_}2pe2i^1K4(7a0htu6>1S76%f^lT;D-fownbIhT z5EMINgb*wuxKqb$o*zV{51CX?vAxyfUs0sCqqWuE366(2f<^P;zTvxP$xA>WIkCFD{5kPfU(Th{(6M zH+bv~j={kkt=3j()@K_^ZMk}lPHz^517Z*hK9JYmS_G_J@K_;CapLz77&|b0Q6SNO z;}obk2nD0bCSp7C=Sg> z3(!Ioj}lNKNbS~PA&O_&;Eodvc09}YKLKmY;(52`ybUE6Fu0U6!tI&3|1MNh+&~CH` z?L}9keP}a% zdI!CW-a|*w`{)DoA^He?j6Ol1qR-Ih=nM2E`U-uGzCquj@6h+?2lOL4ihe>rqhHXk z=r{B``UCxm{z89~1c^wJl#z0hB59H#SyDj;kdw$jGKdT&Cv#S=h%4qwxKgf+E9WY> zO0J5l=4{+r&d$|vwOk$N;Oe;su90ivnz*Ac8i*s`xuAA%OdbvKX zpBvx?xglaA$I7aT~d_xlP+s0kNUCCX=ZRd7yJGoulZf*~^m%EzV$L;5?;jZPb7k;2z`-a1U_@xrez&xJS9ixW~CCxF@-% zxTm>ixM#WNxaYYSxEHyXxR<#@+$-E+?p5wJ?se`B?oIA3?rrWJ?p^LZ?g;lj_W}1I z_YwCo_X+nY_Zjy&_XYPQ_Z9aw_YL;e_u{=`nD1b+kcofK^ARYztXflsNcr=AaN*<|rq~_67 z9!=xXbRNy%(M%qN@@N*1X7ebFM{{@-&Z7t(&E?TN9!2sfibv5ris2C~FyeSLpGOOL zw2(*fJWAkEB9D@Il+2?P9;NbV5s%V%w3tWfJj&qF5*{t((J~&L!XxlyR`3Ysu~j_E z&sE|i%cmzvH3y-WkD&kSG z*Tj)3Y}mq)1_vYE;JA344%gtIMhE^gxV)Ntn?;vr8L@}tG)z2o9I;uO>m`|qNv4k_ z0T8pvWR-AcW1`4$L`8*#CbLzq10P;v%{G|}yr|*0z^t(aiZ%HLolWCg{X9%K6N$5q zce)%Lw3HS2G7x%SU$Qt%7Cix4uEvbngk^)NpwME|8Nl2NQwF&Z7nw6s#MFts zYmjGFks)7aE7q6|8l%22Fk(q*ghh_{ zNh+0wOC^mhr7y_R>vX`q)?~EmjaK2W#$dGAEG33)Zx?0Y!m(ou=je@kv&IUmEVC)w zkZ&;NKyjU3s&N@ElsUGLS4;+@Hopj#XyOEEv1OZ01vV@iE5_3mX{~;uT!GON$D(Np zVTGp^+p8~y76?l-O`*YNGUk^_oMhs%sbkApv>KyLlMhO5Dl%*JHfVw#*noxN2y5Q1 z(c<#a2rt4TEKT4Jw>Jz9;-=axh8&{}kHtow@5ZF5`WAhX8lN|<|15ap~jjk zF>AmjqsEjpS#$MfLAqj<+4-6rZ(aGgMC6zfAVa*IH5qZYh#lnZ851rr9qAmMtsQ+h ztOY~DYBm)5p_(z#Y(FARzEy8F;vUa2n~Dl0j*E^*X(|CFktjrVX`PcWI?ecI>Af| zV_PaQh)c|vpoGO*mhV;Ab(kvBk4oeZ0CoCe10KDa0>kKtKNT17S2T;hP$O6?fg`E@ z^_Vc$57|(dYclFhV0}h)$6p#}is*R`XS<^{0#*&4R&e^E!(cGmjG6*3-)CdO*=S-y zket~o;B$`$X|bBTgYA4wIOiCUV`hpAFzs}d-_+hBn5?WKqYgOCH;GFUagMqe6Ge{_ z>B{mASzu}kKxGVBVAic=V`retaFOtFMT*R3JkG{2aRnw0^C5->(TF9(HmA^MbZy6^ zv7@9grR0Ix(-|z_1C&{81sY>cK6E)2v3Jn#!i7{mh2VFStGLDa>PQ{7wU~Vy-`~xI5>W_KaRRC)PXS7jydVL{GqlRKU`(aPRZ1mE;fN3*EX@TQ4MJAvd z(O%C7!+CqD6i?9QMJ+T5jrooK@SI5sG_yW^LBOhAqFqYXwughQrJ5*TaU*v0C zB+<8s)~v^!j$LbUI{}LZoDXX0M<59WEQ{TUG}#AR{<<;@lv0$d8yV!k128 zs@E1-HL&?0D3{>IO4L7N>ab%_L&G7;B$57xNf-K(j&d#RT<8Q3TL&s-1=}&|LjH*h z&h;(mm49Jg4hHe<0~s-nrED|U_)A`ALluoo0(9{u! z3|w?y-IXbD*+^gReaaSD3yWa<3(KMrImrT#Q<+~iLjMViUuopYCLgCVu{XRiKVgEE zDRBWm35eQIpz%{|*;GvDrxl~E7-dRo!VF9u`p7Z#qOVXkVS!b+K=_yfW_|gD#95el z`50n-sj&Fh*&t|A1knxf#(Y|0vlL}P6h)YUM!gl8ej=oiwfe~+=|- zZ*m;%4yUjM3w}dBtS6wsV*_XT`eMCT22CdgR=Ok|CP3^tK?i{O0JDd~6jDQ4G1%gN z<_t&uu<-$-2~karPXt2Nfgv(a48l8y3vGmH91B)hT}TW$FcYXC&|@;q{(G`wYgB0cFN9NMGMvLK`>L1>T3y(MP6BY)G34;nInnIHS$J~X8Q<+T*5pwT9 zx#vXiz^{XW3WEfkjFFIuZp3@HSwJg%T=4rbUdBHNX%q${`ku@XS7`?@$Uk-Oge4z7 zk?KceE9`GU+#tKi=+u3qeMhnTotYPT4cK z+=_pYo;Zn&gb}5kJJDnJ>4@hs)Od>{u>eP8v*0 z7%AX%7-7N{*4fw~iaVti9B>+4`H8D=@1S}I*R%8_>KW0$*y8X())y4Q zmS2`hS2m)Ua`t5T#5yW)nGHuP1Sd|T#hWp3$^;}ldQ3t-2_ugmI>+YIiwr)1&Qv0C z7>sfB|4x!wuuX+I^N+2_r(j6Kzk`(8IRUKtKX8iY?Fk^KV@Tb<;}kn-bc*p`#v*4yQH*V6#;kaEx@Z0NF!@?kFrwluYQdKh1lE<~KH zguNArBi5|97J>2eal_@27&7PI@GM3D;Oqg6&s>PiOD0PmgF&tT22|uzg3dPRVZY2r zINloO;~GxJzKoHCR0GU4Ruh(o7dajypUmJm2C`9KfSzUYZy>AaWM*^TW|XpW8{;uuio~Lj0!kiVfHqA2}U~^P4H>91=i~@ z+)PE_9!eu`{GdAp*I++MT@&YA@IFV*g1}~rBoV9(UYB6pY%E`itE>8V)k%$zmPjyz zLUZBdj&R;^X2FyMQ0r)5ngt7E+ETap+5SN`Di zagldCm;G1q31@@hFn}b!N(?wY0^_4JJ_~C>xnThXQ!rlf!1xh2B1XMsx$PgDE8uy> zhF7D-2D7yY!VaTw5_dHx#+?@}*8oS3M*$^W@oKaK;~iI{{kapTLxWK~0dC69hSLqE zY={tR%~H%<-iR^BhbE3AL5NQzmyT}Ydbw-CNXMP}CRm4xF1xU$iBBYHA;_tLg&M>e zB_XzB*yAo>jsvYe zOsAh{yubxT`BpTtM%{`6u8LThh4GSzC zucxv3e^UiSh44`|9S#B6zyg-&HBvlIz6Dot+$Eil@Q>XJh-K*Uu|+@Z3o-VInwSZ( z@g^&*;IPz9=4X!5Z-&F&Gv%-r%Hsk2&UHSDGPxJ5aCg_fv zFx>Kg2j>^2l;4VxR{T4pG5vc7hFbaWpvHFd-56`lc&t)G)-n3`q`LP$48QE;;3w+V z2Qkjllf#*yI}c)*w3CDJ@5VGZ|&;`+W?_< z{1LJNiF*otgM+a7f@f}g{zy1;0k2wU^2;EOC%FcPFp}v6kS0XIJ7t(N305#R-WMk2 zuVU~O{|Q{;^9>B88xJKMD+3`ITrLmZLJ`@NS_yulMkl;4h(Cb&8$I+Ve;Xraoit*B zzQANI1DDMRbCA!WBKdn5FYTo9a3b9CZ(MvFFE7=ThYe1;(>P?r;j6jue(g2^wo`6UL=`7iv!5@RIOkavdr27~7Q z7toPF2uz~hT`&3f|5>!y3l(C=l4y_qXGTZ-TdfIpTqV?BFlxbZns0H`dYq6cY~0X+ zmo19S_#HIiWC=cSB><0_j^8n~;XgscNg)V=flm%E4oe*Wg<(to6D%Ak#LVmQ>&Vz& zgndT6PTXA>sf9wg7R&#v7I+K7~J?jlS(nXT_P>Cs1S^OijWh{*LNCs`dE0u z9)=#wh_Jmb*iG^9xg-G<23mfiKmvfUg2Jb-{E?<%q~!5P;`u$lBZMMXzHS0F6PHdM zSK9wI2B|gTJN+ZC7eI11Y8Evc-j5Jd?m*@qoE2|uGOS%x7&QkcLOVVg9KMH?RAUQ| zBr&2QsJTSq_U$+wnUM97ilP<}iF>GMDu#-s;wVVAQO=`E9#!*bEstvUPz$MeDuGI* zAn8UOkJ@&rrq;6^AQL~W$vlVCJno;O%YJ=2$()h4S`On~$k}*FOH@TW1WuUgv z?zBU4I;R;<#W<>Ro9Y~JMn-g@;7yS+g`^x_{-uQcW|0bIeJM_1xHu(wh%FYA8A`*@ zM%5j&DGsV0n$pOlb{=&IP3h!fFyw__%}85VhJjL+BqtA*4P@ZFh^b44B-D1wbxc$@ zPvymBCIQAR43&5|^bO?paNI!+%c$!0Tk!7*iXA$1Wn=n@_c@n~3R z&^k%tU*GUP0H-Ymtdu2bsS^NSNo|MRgVa?#;&)IxcyyY-rQ9oynNw{c&HsmE#?S^C z)?AQc&yMq*x}-+$r*0+^ucoe{uBEP{uBUFGZlrGF(dj&b&fCDFGkA0+kIv%J#;d7Y zs9UMqsN1PKs5_~mbkyODilYe*T@_*uL?O>2 zBuT7uxb01?qo%vcRf~_&wKpW#oer>CAtHGK&J;WHXfmXWbPI`VAwez>Rdqn#cbsuj z_+3c;Mja%2wvXieq#lJFpwweLI){sfDKIg~4yk?ZPFrdsjCT-)1M=#I!7)AUNMO`7 zf;P&NB%`OPXZ)wg=cyNQhrYn0^LJ1$@n{Qf_+&?KCxpsJ8m@DR3>~Ik+d;j`qpdu; zU`?W!-I1r>+=)|)mWx8bZIP;ahkDn)s`sf63FQvz10G$ngZhX^mqNlx$iIqn1&V3! zd=nK)D4$b563YG57u1*3SJclNDU#Z`y->E-{NFMFxLIhoJ;n5x*?d8$cJlY2-l{3mfkdVd`5>k~nx%90~ z4cIP1ZUFJIn8DTHDuHyat#FL9qRC};xSINLzE#MH;7cSWm$HQ@#mBxWw7d^Rz-)V4 zQ)?gOUGN3KsRu!gaF)$6wL?GFIw8X{pfq(hcC-TrZ5~M0+u>Z2m;w>Nx^6e5<%LwU z31faZQ6gjV@W2o}o`I?u9qj($k8Y3Ndt< z_$MPib)*aEU|I?JD(T5|2n}h^uHn(OJi2Zdt)kWRR32T=qo;ZF3|5B0{leNj+>JW61o<;QUp=Z-!^c*^zj^NP^ zJi47nck}3e9v$>%I;A7&Sj>799ZkpZ=tdraLAZGr9Y@cnA??~NJi3)fw_(;}##QFW zDNKZrInoV1w($6bS&)*z;^>4~6*|WjGXMD0VjV&f%g9Vt$bAY)jU%E-B4UEEKrf;* zCTh(RdMOP_;qKtkojke=YdwpYuu1!v&I8y z&mqNoASWxccxr1M4zO=8Pf-S_rp=rnG5k*TR8G!OJEzZp6zvLbQnAsJ4bC}GLW0o_ z=b^AU;Q@Hili zdW$#mn~>GfTK7^+Y~1{bl3HV9yKCSQk}kM}!~@xft`Hb7R< z4#*n14l;#a3fVtzhMb*`p{GT8lSupvdENc~!P)X366P$rimtBmCScWpBJP4mHlhmT zjK4{v#ZEUuN?foVwR9aFL)X*bdxHgem`9I*5#iCJJbG*|-9&s#x6rMSAop7yJS?NTHx@TKni?A2k(p7CH^tJSLG|bO$@aRn*y~U%qdGrpC z-sRDIJUX(EzLCC(h^KEMg6aL(VdByIJOb|wT%-><8Bhx@6BknrswZC7Al%IWui?W3 zle5kN8ScHeV_5AqquwS=>@&TE4DH!)5r+#L7)LvHaqy0%&$SwU1#SApOOn%;>J}#~ zPRrINq-ipiBrMVC(h{;VQkP_;Wn^b$gRc@2?+YNZHd=X6dsCOkG3u^EnhGEn@2{Ac zU0-gk9UZMTcBjELvO*SJ6tNCqHOud(uz`Vul%=V#E=_<%Do)-neoIMSoH3HVpFRk= zw(0#?nh}!9Jw}7ieGUCM{RI6a{S^H){S5sq{T%%~4PH3-#UJzN6CQoaqtAHsIgh^J z(U&~>ibr2xL%&2s(ue3*=)?4@^lQ*}ZxGQu`UdyYw>)X$$zq;7hbLie*TR#R8{c5ihsnHo-$g(# zm3?9z20 zu6%o6hXITMDe)tZj`HXy z9{tRtUwHKEe)>lmuOT4gIsGgB8~r<8LHx#(fv{kJ%;!9rz>|8O%!aQq<&fhXIIx0x zi$1F;PeIcmy4+p|2PCkVvE0RGhxgeCY*_2<`U7MqEa+WTAx*qng&s)fTGRb)IRzc+XGnr_L}OYvZKH8B*mk@ zc#`4KpPU(9s20N7_;MI=900dCE+9fCddCttRURRivM^;Z(M0<$CWeV+;&}8oPm(+- z1M|QvWa6O#2}CrLR6bf|k-!X35?J%lM5-=K(o8C|2$JvtC!>NBeL10gp}onulS#ud z_T$owa6wNczGaf|!p;blN~|rztns8=;KX;*e_6PK;TcNHWD>9lu=6C%K@xk2{xe!e zH*wg0C!@#QOcc=S{@`yD(mVJ>RY8eNHsN>1WJD7T&1T$zYfFUIP z-psTU%3Vwg)5^5*f_0GM_0CO4y37J7=h#6+qF&x7)r}E@9 zo}A8;Gk9_)Plod3ES{WwHFG+%p4q^h!6YzeQE@yO#*=e+avo34hoQ)m5Igc6SDe39p1*WHg z+b4Mw+pN(Ql$p#^L(PwI9M(c-l@Q@|<0cg}%P5$s%^H1K4;S1N228#{*kI2J6` zYM#sk?m?eK;}n^>K0@GL;wF(z8B;Em1>Gs&Nh3DVlcA)q>lm5o>GUhVgk2`}9t*uu zIMRFUO3ddf7Noa^C#|D=YT4{D_2sa+JPCSf5$=FGGuaQmfGr$H4z%#UA}~;y?c4pR zi`fbo1Z)Xg%9gR^JXyk%r94^2ljXbFO16rvW?{ms;K>f29OB7gEawQX1BY+-^Dbr* zy&fC*OUED)U^|I;)(J~=vWADS4B0H0=r%l{p$Yh!O1;mHjSGA5cAUMc(?YWhARBnH5qwwt9sU)*!=nZ+rVw}6*n0~>f}@r^b@9^ph^6VNUPI1a z%w9Um?qxjL!evOcUcp{9%G`FIgl%}~r(NtG{L?1jWQV}Q=ui9EYexaEz#G|{ z{B6Un>^)dTZewp}?_lo)MY)?NJ9!e^C?`+41YL3O1?9L87OU~>gA9ZaVD0Y#JCFYk z!rX#2Bn)>8Sa?%=Yo8Ex786(s>o$C&>2&yA&}OUC4*mtKt^_9r?D%wDR*tv-N9cvM zt*~_?VZyzjIDtr3Ye#Jh6vDeY08rb4_kUo0iai#gZzbV8!NNA=F7`?GDfVfe?B>ZH zp6uPlK1)Qh&+}v-1T;utmmSZ80$+Zb2M3+^`=y`ZM-(_6zv?75g>(7edd_*=O+NnLG&_-0*oLPo6D&*o3~M}9kuVzIC-0SM@H4)U4L_3vDjFEI zA_&H$;AtpevOafYu2M`P`gbXm3Y9|5lbd;R3r}9?ov;+s6`}q!kYbi%Hcy_%ljmc* zg=1>o0fK`ok(r&DzLSz-t|Dp-K(r!;C%5wC1>z34I5Uf7FBLbz$RqhRzO<4J2#S$WMry^aE!IPKroZ}#Ifp%u-2&HK?_l?X)xMLxo4r>Nsfbr(C^8k;G%$S0eb@O4LBI^e85`)?*<$R_%Pt(fKLOC2K*fGYryZ5Y9@6|>Yda- zX>ii;ByQ4Klg^%W&ZNzgwoJNU(u0$}4h#z{2rLh*3bX~*1l9%C2lfY^7I)((}L53 zR|M;Vn}XK|pC5c#@D;&V1@8#HA^6_l`-2}0ekl0i;75ZW4?YxpIQX^TH-g^^ekb_7 z;P)pplOrdup4>V4qRDqmzH9PBlOLJ<*yJZBzc~5L$!~`QhD;5K4M_~i2w57ErOa0v zm4!;P(yA<0mMY7YmC9=6T4jy0PFb&PR5mMHmF>z-rBmrvb}M_8{mMb*u#!`rsytn} zL3yTfqjHn-T;+MnEy@d&7b!1MUZ&ipyi&Pcxl_4YxmUSQd5!Wqp-KIH?-1ImNSN0g5#pHM!fd`9`4@&)Bf%0tS-%GZ={DBn`PqkK>KzVbum$I4HY zpDVvqey#jg`MvT-;#3P%@v1~svMN=Trb<^WQ7uy~SFKcKsqw_-J!Z$b)V`%)j`#xswY%W ztDaN6s5+#2RrQAIZPk0K4^$tkK2v?E`bPD=>Zs}$)$gjm)JQE?GwJ|!kUB)IQcqLQ zRL@q2tLLes)p6>D>O^&lI!&FSUZ!55&QxpF*=mD2Uu{yG)kW%3b%nZGZCBT+8`RC} zHg%`krS4YusRz~T)TgS~tIt%Qtv*+MzWM_7#p=t{SE#qEcd7TP_p7f}-=@Ap{hIoS z`UCavQ{_|XsS#7>PhB{5&D8R#l~ento;G#;)E!f=nR?ySC#JqQ_2sF*Pm@ohr^QZ7 zo|ZbTa9Y{4ifJ3BZJu`iw1=lXGwr!)zf4EdWz(~#o2IXse(LnIr=K(Z;Pj`bKRf;C z^uJ~hGm>U3nXzn!eMa+)))`x7Tt4H98F$V&Fyr8iBQrjq@#V}(Gu1Pv%}krQV&9; zka^vBSjW`)g)nH4unJ1c*dah7}5(5!W{u9&rV*1lOU&3bdz+p~V3EuT%# zj-H)3J9)NocFF9r+5NLmo4tPaRkQcazGn7Iv)`Qk_UymI*sy@G1!0TA7Khow8pE2y zxUjRr&JMdL?BTFS!#)Z7HthR3)8>TFnL9^2Cx4D{PQ#qeInFtk&)Gd^@0hB>eO6FC$_ik|I(f ziXy5b)<*CV8zVMF?2WiF;^v5FBMwKr7V*biYA!Q3a&G+G#JQ%qrE|;Y4$M7$?uNNH z%)N8&-E%*m`@`I$^OW;u%?q2CInOXJZ(hqh_q^_TyXRd$@5XsA&wFd$JM;dEWFi%j zF_B4;DUmgiEs<@JTO+qcUK#m({L=jPns7XbL0G(b3Vd(OJ=X(FM`&=%MI!(fgurj=nYeo#;=ZKZ{YsC}Y$yD`RqE z3^83X{V{_vJ7TVhxi03Vm^WkIj`=&5jSYx3#F}HRv0G!e#a zar5I+_P;_Bk+qF z{sZ$Lpa0~7Nek2qrY$foC|OXpVB3N{3$9-9&Vo-Ce6}!gVaCFx3kMgjUwFpCXBNJ) z@YVR4@$=%N;@8BN$5+O0iN8Gliul9v@5UcVh)zgMNKU9pXh~>G*q3l~!mSCPCVZFh zLt=X3szgm3@5ty^^8qDL1!zUZ$sCQXr6pVpDqm3DpF z9cg!^{gn3iVzfACap7X~;tLmFxp@2HBa1&@{AK$5^wjjU^fS}XPv4q;IQ`x9BN;O? z=4M1@I5OHZIx`-~cs%3DC80|qmqagdFBw|0ZppzVPcM0P>FlM^OJkSTEp1!cvGmTR z2bLaO7QAfwvYE^5%bJ(9F1vNveajv=W%4OAP6<7w^OU|*22OeSlxI$PZuyMmbC*Xh z?_Yk}^7YFPEq{CYyDJv1NL!Jnjp<&$SzZ%snYD$T(7xN z^S$PG&7WD?to$rv*4C_TSyyHq$@)C&OKpmFnRdB$z4lz~dD`c-uW8@V#psfBDY|vK zGj$tv@993%eWBOrSHqq4m+5!u_hb{fNW zYHszZtM6O==<3JwBJ<+&67yVngL%Vw2lJlJdp18Xe`@~p{F3~&`8D~w@~_Lkp@1xy zR1j3Ky1-IURB(R5Wd+*`UM_g6;2q;MW4LjyvD{c|bQmu+?lkT;zG3{p_>n2flwe9S z@urQYO{Ql|ub5sfoKqNEIKQyHu&1!E@TS7M3-4V+tWm6)w8pZga!vJ`o7UXD=3X;p z4mO9FE6jD~dh-qDJI!}nqi^{9Z z?d5gl4du<{t>tHw-%x&E`G@6SmH$-!bNOEtlPc5|(?P(E6%C7sN$-M>nd)qxU1sciU%qls(7m6 z*@_n`UamM?@mj?Xm7$e!m4%gMmGzaKl|z*qD$lCiRJplwOXcO2S61$*++BHf<^IZB zDj%$Tvhr}{>y>X+zFYZz<%gBuRsK+UwDOlKN0qaRuR6WzjH-=Q=Tx0nwYBP^sy$Wv zs;;fNq3Y(U+p6xYx~J;Cs>4<9R~@aERZpvqt4^<8Rh?O#Rh?IDtX@-Xscx!1tNNnq zi>oiGzO4G{>T9a6ufD1J*6Q1HjnL0+u62rZ0Fgw+AgwPYTIVJ%C^I{ z%XYo(F58Q?w{1VJRji$}HhryWZQa^EYp+{->)QL*KDGA6wTITey7rB=N7jD0_LH@r zul>>Z36V$!-_4ZBn&Gs$!3+>zNSJ`*k_t>wtzhM8XWy+L)jV7CM$M6$4{JWD`Ml=4njdR^uKBIzk6NlWuy$%~m}8S;v*QxSUdQ#0+Z+!$ zo^!nDIOKTM@rL7V$9s;i9N#*=cN}&6;`q(+hvTpM$okxRXZ^PNJ@q%#-%tCvWwf^J!PwRiI|FeN;ARFWjQySC_(;Gq?!WzOG;u{hhk{cE^T;8y+;rfP~8g6a4 ztKr^;2O17EJl61R!{LT^8$NCLs^Qy)9~zD}l8y34x>3bAR(t^SWlf z`JCqM%{Mf^)BIgaL`yw;^r&^wE zd7c4ZCBeJZ7;RG()L>0n{Ds3z1Oa6pVdCE zJ-R)vePMe-`!a|N<+U5z3)?O24eg!no7*pFzqS29`@`*zwm;GSO8aZ=Z?wPN{#pA^ z?Z3AF(f(Hl(-GD&uVYDv29AVwb!_Xnz2mNqdphp#c(CJ%j;A}G>v*B#^-ftQ+nL&V zN~gWEzH?LOrJdV4uj<^{xu^5$&gVPd>U_8J{mzd%KkfXy^PA2;x@28+m!d1MOVu^4 zYev_suCOjcm%Xd6>(s9GU1xS}?7FyXZ`b~=>$-02x~1#(uDiPK?Ru)~*{&D5UhX>F z^?KJ^UGH`s>H50sH|JF6e5c-73jv??&MnT%omV<{ICnd*cHZQ?)p>{WZs&c@2b_;P z4>{j){^0z{`K$8}=ie^m3UEzvsa?}up|07k`L1|ZqASI<(xq`}UD+;+tJqZvFFrK5 z+^!y1ziZI7)Ah9Lkn2^~8?LupKe~}Sz#ZfcajV?Z+~Mwd?r3+Md!akQo$fZe%iOi@ zPIsSs(7n!ms(ZcrT=)6zt?rB5m$)x;-{pSA{flRcC)6{`6XsdqN$@0jQay`38JJvL8`$Kh%Aw0Sx`P7mkV>e=Sm>yzP0{ z^QGq-&-b3Ao}WFxb_aEbcF*db-94v!VRvG8N_Sd!M)%V0g6`t(itg%edv|SjXSb)j zw|k(Q>prb}L-(28Te>gr-q(G7_f6fmcHh-~Z}$V;2fAPCezW`2?k~E(>i)L-hwh`@ zfAz?E=pIGSq@Ec)VLcH&kv(xe3wsiKl6z8mmi6TH<(|eC5fQ>ofMPftXxzUrk>} zUw2<$-(cUmz72h6^=<0g+;@K8mcG4x_xC;3_iWz_eJ}SN?t888qrOl3zUce9@4LPq z`iXv7Ki#kB59|-_pVdF7e{O$Ne{BE!{`CHg{w4j(`g8iN{U!b7{Z;*I`)m8_`(6Fr z{eArd{looy|LOf3`uFx9=zpXC=s?Io*g(`k?7)J7gn_hyjDe*C%Li5t6c211xNYG6 zfdc~%4?H^X;=p?YKM#fu#ttqUTrrqAs2$86Gz{hsng-2-MT3olEracYU4!nyp27aX zp+Ro&w88a*+XrtOd}8p`!Ec6SL*YYdLwQ5ip`xLZp|wNyq1vI=p|+upq28gsp@E^( zht?0BF?7Mu#Y2}4Z5z63XvfesLpKlIHgxCEJwx{mJvsE;(2GNdhF%|fYv|pfBSSw9 z{W%;kJb73-Jass9IBYm#c;0aG@Y3Pz;k;qv@S5S`;j-b%;p*Y8;r`(>hBpmw9^Nv1 o@$jX?mk(bt{NV80>z1y|TUWTQScviwBq{z?XvM$Mf7g}%KaVh4F#rGn diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 8f94031..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme deleted file mode 100644 index dc4eb09..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/TwitterLike.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 6bcab09..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/retsohuang.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - TwitterLike.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - F85CA9701A618E180013CF3F - - primary - - - F85CA9851A618E180013CF3F - - primary - - - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index fe2b454..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,5 +0,0 @@ - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TwitterLike.xcscheme b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TwitterLike.xcscheme deleted file mode 100644 index dc4eb09..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/TwitterLike.xcscheme +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist b/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist deleted file mode 100644 index 6bcab09..0000000 --- a/Demos/TwitterLike/TwitterLike.xcodeproj/xcuserdata/stefan.xcuserdatad/xcschemes/xcschememanagement.plist +++ /dev/null @@ -1,27 +0,0 @@ - - - - - SchemeUserState - - TwitterLike.xcscheme - - orderHint - 0 - - - SuppressBuildableAutocreation - - F85CA9701A618E180013CF3F - - primary - - - F85CA9851A618E180013CF3F - - primary - - - - - From 65b82abc06278ff2f520e2ee2726cfbef06d9d89 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Thu, 5 Feb 2015 16:19:58 +0800 Subject: [PATCH 5/8] Add show page control and remove navigation view when view controller is disappeard --- .../TwitterLike/PagingViewController.swift | 1 + SLPagingViewSwift/SLPagingViewSwift.swift | 20 ++++++++++++++++--- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/Demos/TwitterLike/TwitterLike/PagingViewController.swift b/Demos/TwitterLike/TwitterLike/PagingViewController.swift index 8cd2d2d..d083593 100644 --- a/Demos/TwitterLike/TwitterLike/PagingViewController.swift +++ b/Demos/TwitterLike/TwitterLike/PagingViewController.swift @@ -15,6 +15,7 @@ class PagingViewController: SLPagingViewSwift { let brownViewController = self.storyboard?.instantiateViewControllerWithIdentifier("BrownViewController") as UIViewController let purpleViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PurpleViewController") as UIViewController self.addViewControllers([brownViewController, purpleViewController]) + self.needToShowPageControl = true self.pagingViewMovingRedefine = { (scrollView: UIScrollView, subviews: [UIView]) -> Void in var i = 0 diff --git a/SLPagingViewSwift/SLPagingViewSwift.swift b/SLPagingViewSwift/SLPagingViewSwift.swift index a72aefd..cf8eccb 100644 --- a/SLPagingViewSwift/SLPagingViewSwift.swift +++ b/SLPagingViewSwift/SLPagingViewSwift.swift @@ -31,6 +31,11 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { var pagingViewMovingRedefine: SLPagingViewMovingRedefine? var didChangedPage: SLPagingViewDidChanged? var navigationSideItemsStyle: SLNavigationSideItemsStyle = .SLNavigationSideItemsStyleDefault + public var needToShowPageControl: Bool = false { + didSet { + setupPagingProcess() + } + } // MARK: - Private properties private var screenSize: CGSize { @@ -40,7 +45,6 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { private var pageControl: UIPageControl = UIPageControl() private var navigationBarView: UIView = UIView() private var navigationItems = [UIView]() - private var needToShowPageControl: Bool = false private var isUserInteraction: Bool = false private var indexSelected: NSInteger = 0 @@ -116,6 +120,16 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { } } + public override func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + self.navigationController?.navigationBar.addSubview(self.navigationBarView) + } + + public override func viewWillDisappear(animated: Bool) { + super.viewWillDisappear(animated) + self.navigationBarView.removeFromSuperview() + } + override public func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. @@ -235,8 +249,8 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { self.navigationBarView.addSubview(self.pageControl) } - self.navigationController?.navigationBar.addSubview(self.navigationBarView) - +// self.navigationController?.navigationBar.addSubview(self.navigationBarView) + } // Loads all views From b25077841c80954b54ff2e7830667c153a25dc7e Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Mon, 16 Mar 2015 15:03:56 +0800 Subject: [PATCH 6/8] Bux fixes. --- SLPagingViewSwift/SLPagingViewSwift.swift | 178 +++++++++++----------- 1 file changed, 92 insertions(+), 86 deletions(-) diff --git a/SLPagingViewSwift/SLPagingViewSwift.swift b/SLPagingViewSwift/SLPagingViewSwift.swift index cf8eccb..cf6f2e6 100644 --- a/SLPagingViewSwift/SLPagingViewSwift.swift +++ b/SLPagingViewSwift/SLPagingViewSwift.swift @@ -24,11 +24,22 @@ typealias SLPagingViewDidChanged = ((currentPage: NSInteger)-> ()) public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { // MARK: - Public properties + weak var embedNavigationController: UINavigationController? var viewsOrContrllers = [Int: UIResponder]() var currentPageControlColor: UIColor? - var tintPageControlColor: UIColor? + var tintPageControlColor: UIColor? { + didSet { + setupPagingProcess() + } + } var pagingViewMoving: SLPagingViewMoving? - var pagingViewMovingRedefine: SLPagingViewMovingRedefine? + var pagingViewMovingRedefine: SLPagingViewMovingRedefine? { + didSet { + if let pagingViewMovingAnimation = self.pagingViewMovingRedefine { + pagingViewMovingAnimation(scrollView: scrollView, subviews: self.navigationItems) + } + } + } var didChangedPage: SLPagingViewDidChanged? var navigationSideItemsStyle: SLNavigationSideItemsStyle = .SLNavigationSideItemsStyleDefault public var needToShowPageControl: Bool = false { @@ -38,9 +49,6 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { } // MARK: - Private properties - private var screenSize: CGSize { - return UIScreen.mainScreen().bounds.size - } private var scrollView: UIScrollView = UIScrollView() private var pageControl: UIPageControl = UIPageControl() private var navigationBarView: UIView = UIView() @@ -111,35 +119,6 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { self.setup(items, viewsOrControllers: viewsOrControllers) } - // MARK: - Life cycle - override public func viewDidLoad() { - super.viewDidLoad() - if self.viewsOrContrllers.count > 0 { - self.setupPagingProcess() - self.setCurrentIndex(self.indexSelected, animated: false) - } - } - - public override func viewWillAppear(animated: Bool) { - super.viewWillAppear(animated) - self.navigationController?.navigationBar.addSubview(self.navigationBarView) - } - - public override func viewWillDisappear(animated: Bool) { - super.viewWillDisappear(animated) - self.navigationBarView.removeFromSuperview() - } - - override public func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. - } - - override public func viewWillLayoutSubviews() { - super.viewWillLayoutSubviews() - self.navigationBarView.frame = CGRectMake(0, 0, screenSize.width, 44) - } - // MARK: - Public methods /** @@ -169,15 +148,50 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { * @param animated animate the moving */ func setCurrentIndex(index: NSInteger, animated: Bool){ - // Be sure we got an existing index - if(index < 0 || index > self.navigationBarView.subviews.count - 1){ - var exc = NSException(name: "Index out of range", reason: "The index is out of range of subviews's countsd!", userInfo: nil) - exc.raise() - } - self.indexSelected = index - // Get the right position and update it - var xOffset = CGFloat(index) * self.screenSize.width - self.scrollView.setContentOffset(CGPointMake(xOffset, self.scrollView.contentOffset.y), animated: animated) + // Be sure we got an existing index + if(index < 0 || index > self.navigationBarView.subviews.count - 1){ + var exc = NSException(name: "Index out of range", reason: "The index is out of range of subviews's countsd!", userInfo: nil) + exc.raise() + } + self.indexSelected = index + // Get the right position and update it + var xOffset = CGFloat(index) * self.view.frame.width + self.scrollView.setContentOffset(CGPointMake(xOffset, self.scrollView.contentOffset.y), animated: animated) + } + + // MARK: - Life cycle + override public func viewDidLoad() { + super.viewDidLoad() + if self.viewsOrContrllers.count > 0 { + self.setupPagingProcess() + self.setCurrentIndex(self.indexSelected, animated: false) + } + } + + public override func viewDidLayoutSubviews() { + super.viewDidLayoutSubviews() + } + + public override func viewWillAppear(animated: Bool) { + super.viewWillAppear(animated) + } + + public override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + if let navigationController = self.embedNavigationController { + navigationController.navigationBar.addSubview(self.navigationBarView) + } else if let navigationController = self.navigationController { + navigationController.navigationBar.addSubview(self.navigationBarView) + } + } + + public override func viewWillDisappear(animated: Bool) { + super.viewWillDisappear(animated) + self.navigationBarView.removeFromSuperview() + } + + override public func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() } // MARK: - Internal methods @@ -185,7 +199,7 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { var i = 0 for item in items { var vSize: CGSize = item.isKindOfClass(UILabel.classForCoder()) ? self.getLabelSize(item as UILabel) : item.frame.size - var originX = (screenSize.width/2.0 - vSize.width/2.0) + CGFloat(i * 100) + var originX = (self.view.frame.width/2.0 - vSize.width/2.0) + CGFloat(i * 100) item.frame = CGRectMake(originX, 8, vSize.width, vSize.height) item.tag = i var tap = UITapGestureRecognizer(target: self, action: "tapOnHeader:") @@ -219,37 +233,33 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { return titleLabels } private func setupPagingProcess() { - var frame: CGRect = CGRectMake(0, 0, screenSize.width, self.view.frame.height) + self.scrollView = UIScrollView(frame: self.view.frame) + self.scrollView.backgroundColor = UIColor.clearColor() + self.scrollView.pagingEnabled = true + self.scrollView.showsHorizontalScrollIndicator = false + self.scrollView.showsVerticalScrollIndicator = false + self.scrollView.delegate = self + self.scrollView.bounces = false + self.view.addSubview(self.scrollView) + + // Adds all views + self.addViews() - self.scrollView = UIScrollView(frame: frame) - self.scrollView.backgroundColor = UIColor.clearColor() - self.scrollView.pagingEnabled = true - self.scrollView.showsHorizontalScrollIndicator = false - self.scrollView.showsVerticalScrollIndicator = false - self.scrollView.delegate = self - self.scrollView.bounces = false - self.scrollView.contentInset = UIEdgeInsets(top: 0, left: 0, bottom: -80, right: 0) - - self.view.addSubview(self.scrollView) - - // Adds all views - self.addViews() - - if(self.needToShowPageControl){ - // Make the page control - self.pageControl = UIPageControl(frame: CGRectMake(0, 35, 0, 0)) - self.pageControl.numberOfPages = self.navigationBarView.subviews.count - self.pageControl.currentPage = 0 - if self.currentPageControlColor != nil { - self.pageControl.currentPageIndicatorTintColor = self.currentPageControlColor - } - if self.tintPageControlColor != nil { - self.pageControl.pageIndicatorTintColor = self.tintPageControlColor - } - self.navigationBarView.addSubview(self.pageControl) + self.pageControl.removeFromSuperview() + + if(self.needToShowPageControl){ + // Make the page control + self.pageControl = UIPageControl(frame: CGRectMake(0, 35, self.view.frame.size.width, 0)) + self.pageControl.numberOfPages = self.navigationBarView.subviews.count + self.pageControl.currentPage = 0 + if self.currentPageControlColor != nil { + self.pageControl.currentPageIndicatorTintColor = self.currentPageControlColor } - -// self.navigationController?.navigationBar.addSubview(self.navigationBarView) + if self.tintPageControlColor != nil { + self.pageControl.pageIndicatorTintColor = self.tintPageControlColor + } + self.navigationBarView.addSubview(self.pageControl) + } } @@ -257,10 +267,10 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { private func addViews() { var index = 0 for (key, viewOrViewController) in viewsOrContrllers { - let width = screenSize.width * CGFloat(viewsOrContrllers.count) + let width = self.view.frame.width * CGFloat(viewsOrContrllers.count) let height = self.view.frame.height self.scrollView.contentSize = CGSize(width: width, height: height) - let viewFrame = CGRect(x: screenSize.width * CGFloat(index), y: 0, width: screenSize.width, height: screenSize.height) + let viewFrame = CGRect(x: self.view.frame.width * CGFloat(index), y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height) if let view = viewOrViewController as? UIView { view.frame = viewFrame scrollView.addSubview(view) @@ -280,7 +290,7 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { private func sendNewIndex(scrollView: UIScrollView){ var xOffset = Float(scrollView.contentOffset.x) - var currentIndex = (Int(roundf(xOffset)) % (self.navigationBarView.subviews.count * Int(self.screenSize.width))) / Int(self.screenSize.width) + var currentIndex = (Int(roundf(xOffset)) % (self.navigationBarView.subviews.count * Int(self.view.frame.width))) / Int(self.view.frame.size.width) if(self.pageControl.currentPage != currentIndex) { self.pageControl.currentPage = currentIndex if self.didChangedPage != nil { @@ -290,9 +300,9 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { } func getOriginX(vSize: CGSize, idx: CGFloat, distance: CGFloat, xOffset: CGFloat) -> CGFloat{ - var result = self.screenSize.width / 2.0 - vSize.width/2.0 + var result = self.view.frame.size.width / 2.0 - vSize.width/2.0 result += (idx * distance) - result -= xOffset / (self.screenSize.width / distance) + result -= xOffset / (self.view.frame.size.width / distance) return result } @@ -310,10 +320,6 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { } } } - - - - } @@ -330,11 +336,11 @@ extension SLPagingViewSwift: UIScrollViewDelegate { v.frame = CGRectMake(originX, 8, vSize.width, vSize.height) i++ } - if (self.pagingViewMovingRedefine != nil) { - self.pagingViewMovingRedefine!(scrollView: scrollView, subviews: self.navigationItems) + if let pagingViewMovingAnimation = self.pagingViewMovingRedefine { + pagingViewMovingAnimation(scrollView: scrollView, subviews: self.navigationItems) } - if (self.pagingViewMoving != nil) { - self.pagingViewMoving!(subviews: self.navigationItems) + if let pagingViewMoving = self.pagingViewMoving { + pagingViewMoving(subviews: self.navigationItems) } } From 08dca8753d1a9a9d567911d6ea3c42097fa6c020 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Mon, 16 Mar 2015 16:29:21 +0800 Subject: [PATCH 7/8] Fix view controller not call appear methods issue --- SLPagingViewSwift/SLPagingViewSwift.swift | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/SLPagingViewSwift/SLPagingViewSwift.swift b/SLPagingViewSwift/SLPagingViewSwift.swift index cf6f2e6..5f88bfb 100644 --- a/SLPagingViewSwift/SLPagingViewSwift.swift +++ b/SLPagingViewSwift/SLPagingViewSwift.swift @@ -174,10 +174,21 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { public override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) + self.childViewControllers + for viewOrViewController in self.viewsOrContrllers.values { + if let viewController = viewOrViewController as? UIViewController { + viewController.willMoveToParentViewController(self) + } + } } public override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) + for viewOrViewController in self.viewsOrContrllers.values { + if let viewController = viewOrViewController as? UIViewController { + viewController.didMoveToParentViewController(self) + } + } if let navigationController = self.embedNavigationController { navigationController.navigationBar.addSubview(self.navigationBarView) } else if let navigationController = self.navigationController { @@ -216,9 +227,10 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { view.tag = index viewsOrContrllers[index] = view } - if let controller = viewOrController as? UIViewController { - controller.view.tag = index - viewsOrContrllers[index] = controller + if let viewController = viewOrController as? UIViewController { + self.addChildViewController(viewController) + viewController.view.tag = index + viewsOrContrllers[index] = viewController } index++ } @@ -241,7 +253,7 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { self.scrollView.delegate = self self.scrollView.bounces = false self.view.addSubview(self.scrollView) - + // Adds all views self.addViews() From 6173d900300518e1aa6d596af5fb7d0edb819f75 Mon Sep 17 00:00:00 2001 From: Retso Huang Date: Tue, 24 Mar 2015 11:21:14 +0800 Subject: [PATCH 8/8] Fix incorrect index. --- SLPagingViewSwift/SLPagingViewSwift.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/SLPagingViewSwift/SLPagingViewSwift.swift b/SLPagingViewSwift/SLPagingViewSwift.swift index 5f88bfb..7b96490 100644 --- a/SLPagingViewSwift/SLPagingViewSwift.swift +++ b/SLPagingViewSwift/SLPagingViewSwift.swift @@ -277,12 +277,11 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { // Loads all views private func addViews() { - var index = 0 for (key, viewOrViewController) in viewsOrContrllers { let width = self.view.frame.width * CGFloat(viewsOrContrllers.count) let height = self.view.frame.height self.scrollView.contentSize = CGSize(width: width, height: height) - let viewFrame = CGRect(x: self.view.frame.width * CGFloat(index), y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height) + let viewFrame = CGRect(x: self.view.frame.width * CGFloat(key), y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height) if let view = viewOrViewController as? UIView { view.frame = viewFrame scrollView.addSubview(view) @@ -291,7 +290,6 @@ public class SLPagingViewSwift: UIViewController, UIScrollViewDelegate { viewController.view.frame = viewFrame scrollView.addSubview(viewController.view) } - index++ } }