├── Examples └── Sample │ ├── Sample │ ├── en.lproj │ │ └── InfoPlist.strings │ ├── Default.png │ ├── Default@2x.png │ ├── Default-568h@2x.png │ ├── html-fixture │ │ └── NSHipster.com │ │ │ └── NSHipster.com_files │ │ │ ├── book-cover@2x.png │ │ │ ├── cfhipsterref-cover@2x.png │ │ │ ├── the-nshipster-fake-book-cover@2x.png │ │ │ ├── cc.js │ │ │ ├── application.js │ │ │ ├── embed.js │ │ │ ├── analytics.js │ │ │ └── swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css │ ├── Sample-Prefix.pch │ ├── AppDelegate.h │ ├── main.m │ ├── Sample-Info.plist │ ├── AppDelegate.m │ └── Launch Screen.xib │ ├── Pods │ ├── Target Support Files │ │ ├── Pods-IPSqueezableViewController │ │ │ ├── Pods-IPSqueezableViewController.xcconfig │ │ │ ├── Pods-IPSqueezableViewController-prefix.pch │ │ │ ├── Pods-IPSqueezableViewController-dummy.m │ │ │ └── Pods-IPSqueezableViewController-Private.xcconfig │ │ ├── Pods │ │ │ ├── Pods-dummy.m │ │ │ ├── Pods.debug.xcconfig │ │ │ ├── Pods.release.xcconfig │ │ │ ├── Pods-environment.h │ │ │ ├── Pods-acknowledgements.markdown │ │ │ ├── Pods-acknowledgements.plist │ │ │ └── Pods-resources.sh │ │ └── Pods-CruiserWebViewController │ │ │ ├── Pods-CruiserWebViewController.xcconfig │ │ │ ├── Pods-CruiserWebViewController-prefix.pch │ │ │ ├── Pods-CruiserWebViewController-dummy.m │ │ │ └── Pods-CruiserWebViewController-Private.xcconfig │ ├── Headers │ │ ├── Build │ │ │ ├── CruiserWebViewController │ │ │ │ ├── CruiserWebView.h │ │ │ │ ├── CruiserPolyActivity.h │ │ │ │ └── CruiserWebViewController.h │ │ │ └── IPSqueezableViewController │ │ │ │ └── IPNavBarSqueezableViewController.h │ │ └── Public │ │ │ ├── CruiserWebViewController │ │ │ ├── CruiserWebView.h │ │ │ ├── CruiserPolyActivity.h │ │ │ └── CruiserWebViewController.h │ │ │ └── IPSqueezableViewController │ │ │ └── IPNavBarSqueezableViewController.h │ ├── IPSqueezableViewController │ │ ├── Resources │ │ │ ├── backButton.png │ │ │ ├── backButton@2x.png │ │ │ ├── invisibleBackButton.png │ │ │ └── invisibleBackButton@2x.png │ │ ├── LICENSE │ │ ├── Classes │ │ │ ├── IPNavBarSqueezableViewController.h │ │ │ └── IPNavBarSqueezableViewController.m │ │ └── README.md │ ├── Manifest.lock │ └── Local Podspecs │ │ └── CruiserWebViewController.podspec │ ├── Podfile │ ├── Sample.xcodeproj │ ├── project.xcworkspace │ │ ├── contents.xcworkspacedata │ │ └── xcshareddata │ │ │ └── Sample.xccheckout │ └── project.pbxproj │ ├── Sample.xcworkspace │ └── contents.xcworkspacedata │ ├── Podfile.lock │ └── IPSqueezableViewController.podspec ├── Docs ├── CruiserWebViewController_screenshot.png └── CruiserWebViewController_screenshot_ipad.png ├── Source ├── Resources │ ├── cruiser_icn_toolbar_pin.png │ ├── cruiser_icn_toolbar_up.png │ ├── cruiser_icn_toolbar_web.png │ ├── cruiser_icn_toolbar_down.png │ ├── cruiser_icn_toolbar_face.png │ ├── cruiser_icn_toolbar_stop.png │ ├── cruiser_icn_toolbar_up@2x.png │ ├── cruiser_icn_toolbar_up@3x.png │ ├── cruiser_icn_activity_link@2x.png │ ├── cruiser_icn_toolbar_action.png │ ├── cruiser_icn_toolbar_backward.png │ ├── cruiser_icn_toolbar_down@2x.png │ ├── cruiser_icn_toolbar_down@3x.png │ ├── cruiser_icn_toolbar_face@2x.png │ ├── cruiser_icn_toolbar_face@3x.png │ ├── cruiser_icn_toolbar_forward.png │ ├── cruiser_icn_toolbar_pin@2x.png │ ├── cruiser_icn_toolbar_pin@3x.png │ ├── cruiser_icn_toolbar_reload.png │ ├── cruiser_icn_toolbar_stop@2x.png │ ├── cruiser_icn_toolbar_stop@3x.png │ ├── cruiser_icn_toolbar_web@2x.png │ ├── cruiser_icn_toolbar_web@3x.png │ ├── cruiser_icn_activity_chrome@2x.png │ ├── cruiser_icn_activity_opera@2x.png │ ├── cruiser_icn_toolbar_action@2x.png │ ├── cruiser_icn_toolbar_action@3x.png │ ├── cruiser_icn_toolbar_forward@2x.png │ ├── cruiser_icn_toolbar_forward@3x.png │ ├── cruiser_icn_toolbar_reload@2x.png │ ├── cruiser_icn_toolbar_reload@3x.png │ ├── cruiser_icn_activity_dolphin@2x.png │ ├── cruiser_icn_activity_link@2x~ipad.png │ ├── cruiser_icn_toolbar_backward@2x.png │ ├── cruiser_icn_toolbar_backward@3x.png │ ├── cruiser_icn_activity_chrome@2x~ipad.png │ ├── cruiser_icn_activity_opera@2x~ipad.png │ ├── cruiser_icn_activity_safari@2x~ipad.png │ ├── cruiser_icn_activity_dolphin@2x~ipad.png │ ├── de.lproj │ │ └── CruiserWebViewController.strings │ ├── en.lproj │ │ └── CruiserWebViewController.strings │ └── es.lproj │ │ └── CruiserWebViewController.strings └── Classes │ ├── CruiserWebView.h │ ├── CruiserPolyActivity.h │ ├── CruiserWebView.m │ ├── CruiserPolyActivity.m │ └── CruiserWebViewController.h ├── .gitignore ├── CruiserWebViewController.podspec ├── LICENSE └── README.md /Examples/Sample/Sample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-IPSqueezableViewController/Pods-IPSqueezableViewController.xcconfig: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Build/CruiserWebViewController/CruiserWebView.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserWebView.h -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Public/CruiserWebViewController/CruiserWebView.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserWebView.h -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Build/CruiserWebViewController/CruiserPolyActivity.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserPolyActivity.h -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Public/CruiserWebViewController/CruiserPolyActivity.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserPolyActivity.h -------------------------------------------------------------------------------- /Examples/Sample/Sample/Default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/Default.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Build/CruiserWebViewController/CruiserWebViewController.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserWebViewController.h -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Public/CruiserWebViewController/CruiserWebViewController.h: -------------------------------------------------------------------------------- 1 | ../../../../../../Source/Classes/CruiserWebViewController.h -------------------------------------------------------------------------------- /Examples/Sample/Sample/Default@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/Default@2x.png -------------------------------------------------------------------------------- /Docs/CruiserWebViewController_screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Docs/CruiserWebViewController_screenshot.png -------------------------------------------------------------------------------- /Examples/Sample/Sample/Default-568h@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/Default-568h@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_pin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_pin.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_up.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_up.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_web.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_down.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_face.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_face.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_stop.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_up@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_up@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_up@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_up@3x.png -------------------------------------------------------------------------------- /Docs/CruiserWebViewController_screenshot_ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Docs/CruiserWebViewController_screenshot_ipad.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_link@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_link@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_action.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_action.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_backward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_backward.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_down@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_down@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_down@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_down@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_face@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_face@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_face@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_face@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_forward.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_forward.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_pin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_pin@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_pin@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_pin@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_reload.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_reload.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_stop@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_stop@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_stop@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_stop@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_web@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_web@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_web@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_web@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_chrome@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_chrome@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_opera@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_opera@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_action@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_action@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_action@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_action@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_forward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_forward@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_forward@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_forward@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_reload@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_reload@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_reload@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_reload@3x.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Build/IPSqueezableViewController/IPNavBarSqueezableViewController.h: -------------------------------------------------------------------------------- 1 | ../../../IPSqueezableViewController/Classes/IPNavBarSqueezableViewController.h -------------------------------------------------------------------------------- /Examples/Sample/Pods/Headers/Public/IPSqueezableViewController/IPNavBarSqueezableViewController.h: -------------------------------------------------------------------------------- 1 | ../../../IPSqueezableViewController/Classes/IPNavBarSqueezableViewController.h -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_dolphin@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_dolphin@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_link@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_link@2x~ipad.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_backward@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_backward@2x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_toolbar_backward@3x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_toolbar_backward@3x.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_chrome@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_chrome@2x~ipad.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_opera@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_opera@2x~ipad.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_safari@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_safari@2x~ipad.png -------------------------------------------------------------------------------- /Source/Resources/cruiser_icn_activity_dolphin@2x~ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Source/Resources/cruiser_icn_activity_dolphin@2x~ipad.png -------------------------------------------------------------------------------- /Examples/Sample/Podfile: -------------------------------------------------------------------------------- 1 | 2 | source 'https://github.com/CocoaPods/Specs.git' 3 | platform :ios, '8.0' 4 | 5 | pod 'CruiserWebViewController', path: '../../CruiserWebViewController.podspec' 6 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods : NSObject 3 | @end 4 | @implementation PodsDummy_Pods 5 | @end 6 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-CruiserWebViewController/Pods-CruiserWebViewController.xcconfig: -------------------------------------------------------------------------------- 1 | PODS_CRUISERWEBVIEWCONTROLLER_OTHER_LDFLAGS = -framework "UIKit" -framework "WebKit" -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-CruiserWebViewController/Pods-CruiserWebViewController-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-environment.h" 6 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-IPSqueezableViewController/Pods-IPSqueezableViewController-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #endif 4 | 5 | #import "Pods-environment.h" 6 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Resources/backButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Pods/IPSqueezableViewController/Resources/backButton.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Resources/backButton@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Pods/IPSqueezableViewController/Resources/backButton@2x.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Resources/invisibleBackButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Pods/IPSqueezableViewController/Resources/invisibleBackButton.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Resources/invisibleBackButton@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Pods/IPSqueezableViewController/Resources/invisibleBackButton@2x.png -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/book-cover@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/book-cover@2x.png -------------------------------------------------------------------------------- /Examples/Sample/Sample.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/cfhipsterref-cover@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/cfhipsterref-cover@2x.png -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/the-nshipster-fake-book-cover@2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Pitometsu/CruiserWebViewController/HEAD/Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/the-nshipster-fake-book-cover@2x.png -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-CruiserWebViewController/Pods-CruiserWebViewController-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_CruiserWebViewController : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_CruiserWebViewController 5 | @end 6 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-IPSqueezableViewController/Pods-IPSqueezableViewController-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_IPSqueezableViewController : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_IPSqueezableViewController 5 | @end 6 | -------------------------------------------------------------------------------- /Examples/Sample/Sample.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | # Thumbnails 4 | ._* 5 | 6 | # Files that might appear on external disk 7 | .Spotlight-V100 8 | .Trashes 9 | 10 | # Xcode 11 | build/* 12 | *.pbxuser 13 | !default.pbxuser 14 | *.mode1v3 15 | !default.mode1v3 16 | *.mode2v3 17 | !default.mode2v3 18 | *.perspectivev3 19 | !default.perspectivev3 20 | xcuserdata 21 | profile 22 | *.moved-aside 23 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/Sample-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_3_0 10 | #warning "This project uses features only available in iOS SDK 3.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Sample 4 | // 5 | // Created by Ignacio on 3/27/14. 6 | // Improved by Yuriy Pitomets on 23/01/2015 7 | // Copyright (c) 2014 DZN Labs. All rights reserved. 8 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 9 | // 10 | 11 | #import 12 | 13 | @interface AppDelegate : UIResponder 14 | 15 | @property (strong, nonatomic) UIWindow *window; 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/cc.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | 3 | var i = new Image(); 4 | 5 | var params = '?url=' + encodeURIComponent(window.location.href); 6 | if (typeof Swiftype !== 'undefined' && typeof Swiftype.key !== 'undefined') { 7 | params += '&engine_key=' + Swiftype.key; 8 | } 9 | if (document.referrer != "") { params += "&r=" + encodeURIComponent(document.referrer); } 10 | 11 | i.src = "//cc.swiftype.com/cc" + params; 12 | })(); 13 | -------------------------------------------------------------------------------- /Source/Resources/de.lproj/CruiserWebViewController.strings: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebViewController.strings 3 | // CruiserWebViewController 4 | // https://github.com/pitometsu/CruiserWebViewController 5 | // 6 | // Created by Paul Dziwoki on 25/07/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | "Backward" = "Zurück"; 14 | "Forward" = "Vorwärts"; 15 | -------------------------------------------------------------------------------- /Source/Resources/en.lproj/CruiserWebViewController.strings: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebViewController.strings 3 | // CruiserWebViewController 4 | // https://github.com/pitometsu/CruiserWebViewController 5 | // 6 | // Created by Paul Dziwoki on 25/07/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | "Backward" = "Backward"; 14 | "Forward" = "Forward"; 15 | -------------------------------------------------------------------------------- /Source/Resources/es.lproj/CruiserWebViewController.strings: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebViewController.strings 3 | // CruiserWebViewController 4 | // https://github.com/pitometsu/CruiserWebViewController 5 | // 6 | // Created by Paul Dziwoki on 25/07/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | "Backward" = "Retroceder"; 14 | "Forward" = "Avanzar"; 15 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-IPSqueezableViewController/Pods-IPSqueezableViewController-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-IPSqueezableViewController.xcconfig" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/IPSqueezableViewController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/CruiserWebViewController" "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 4 | OTHER_LDFLAGS = -ObjC 5 | PODS_ROOT = ${SRCROOT} -------------------------------------------------------------------------------- /Examples/Sample/Sample/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Sample 4 | // 5 | // Created by Ignacio on 3/27/14. 6 | // Improved by Yuriy Pitomets on 23/01/2015 7 | // Copyright (c) 2014 DZN Labs. All rights reserved. 8 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 9 | // 10 | 11 | #import 12 | 13 | #import "AppDelegate.h" 14 | 15 | int main(int argc, char * argv[]) 16 | { 17 | @autoreleasepool { 18 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods-CruiserWebViewController/Pods-CruiserWebViewController-Private.xcconfig: -------------------------------------------------------------------------------- 1 | #include "Pods-CruiserWebViewController.xcconfig" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Build" "${PODS_ROOT}/Headers/Build/CruiserWebViewController" "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/CruiserWebViewController" "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 4 | OTHER_LDFLAGS = ${PODS_CRUISERWEBVIEWCONTROLLER_OTHER_LDFLAGS} -ObjC 5 | PODS_ROOT = ${SRCROOT} -------------------------------------------------------------------------------- /Examples/Sample/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CruiserWebViewController (7.0): 3 | - IPSqueezableViewController (>= 0.0.2) 4 | - IPSqueezableViewController (0.0.2) 5 | 6 | DEPENDENCIES: 7 | - CruiserWebViewController (from `../../CruiserWebViewController.podspec`) 8 | 9 | EXTERNAL SOURCES: 10 | CruiserWebViewController: 11 | :path: ../../CruiserWebViewController.podspec 12 | 13 | SPEC CHECKSUMS: 14 | CruiserWebViewController: ec1c201e81d82fa149f388134764d0363ed3382d 15 | IPSqueezableViewController: 00f53b20ce38e7b08f86c1a1066fb15d13b7ed58 16 | 17 | COCOAPODS: 0.35.0 18 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - CruiserWebViewController (7.0): 3 | - IPSqueezableViewController (>= 0.0.2) 4 | - IPSqueezableViewController (0.0.2) 5 | 6 | DEPENDENCIES: 7 | - CruiserWebViewController (from `../../CruiserWebViewController.podspec`) 8 | 9 | EXTERNAL SOURCES: 10 | CruiserWebViewController: 11 | :path: ../../CruiserWebViewController.podspec 12 | 13 | SPEC CHECKSUMS: 14 | CruiserWebViewController: ec1c201e81d82fa149f388134764d0363ed3382d 15 | IPSqueezableViewController: 00f53b20ce38e7b08f86c1a1066fb15d13b7ed58 16 | 17 | COCOAPODS: 0.35.0 18 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods.debug.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/CruiserWebViewController" "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/CruiserWebViewController" -isystem "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 4 | OTHER_LDFLAGS = -ObjC -l"Pods-CruiserWebViewController" -l"Pods-IPSqueezableViewController" -framework "UIKit" -framework "WebKit" 5 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods.release.xcconfig: -------------------------------------------------------------------------------- 1 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 2 | HEADER_SEARCH_PATHS = "${PODS_ROOT}/Headers/Public" "${PODS_ROOT}/Headers/Public/CruiserWebViewController" "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 3 | OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers/Public" -isystem "${PODS_ROOT}/Headers/Public/CruiserWebViewController" -isystem "${PODS_ROOT}/Headers/Public/IPSqueezableViewController" 4 | OTHER_LDFLAGS = -ObjC -l"Pods-CruiserWebViewController" -l"Pods-IPSqueezableViewController" -framework "UIKit" -framework "WebKit" 5 | OTHER_LIBTOOLFLAGS = $(OTHER_LDFLAGS) 6 | PODS_ROOT = ${SRCROOT}/Pods -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods-environment.h: -------------------------------------------------------------------------------- 1 | 2 | // To check if a library is compiled with CocoaPods you 3 | // can use the `COCOAPODS` macro definition which is 4 | // defined in the xcconfigs so it is available in 5 | // headers also when they are imported in the client 6 | // project. 7 | 8 | 9 | // CruiserWebViewController 10 | #define COCOAPODS_POD_AVAILABLE_CruiserWebViewController 11 | #define COCOAPODS_VERSION_MAJOR_CruiserWebViewController 7 12 | #define COCOAPODS_VERSION_MINOR_CruiserWebViewController 0 13 | #define COCOAPODS_VERSION_PATCH_CruiserWebViewController 0 14 | 15 | // IPSqueezableViewController 16 | #define COCOAPODS_POD_AVAILABLE_IPSqueezableViewController 17 | #define COCOAPODS_VERSION_MAJOR_IPSqueezableViewController 0 18 | #define COCOAPODS_VERSION_MINOR_IPSqueezableViewController 0 19 | #define COCOAPODS_VERSION_PATCH_IPSqueezableViewController 2 20 | 21 | -------------------------------------------------------------------------------- /Examples/Sample/IPSqueezableViewController.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "IPSqueezableViewController" 3 | s.version = "0.0.2" 4 | s.summary = "Condensing effect of navigation bar as the one in Safari.app " 5 | 6 | s.description = <<-DESC 7 | A condensing effect of navigation bar as we see in Safari.app. Support iOS 7. 8 | DESC 9 | 10 | s.homepage = "http://github.com/zetachang/IPSqueezableViewController" 11 | 12 | s.license = "MIT" 13 | 14 | s.author = "David Chang" 15 | s.social_media_url = "http://twitter.com/zetachang" 16 | 17 | s.platform = :ios, "7.0" 18 | 19 | s.source = { :git => "https://github.com/Pitometsu/IPSqueezableViewController.git", :tag => "#{s.version}" } 20 | 21 | s.source_files = "Classes" 22 | 23 | s.resources = "Resources/*.png" 24 | 25 | s.requires_arc = true 26 | end 27 | -------------------------------------------------------------------------------- /CruiserWebViewController.podspec: -------------------------------------------------------------------------------- 1 | 2 | @version = "7.0" 3 | 4 | Pod::Spec.new do |s| 5 | s.name = "CruiserWebViewController" 6 | s.version = @version 7 | s.summary = "Yet another one WebKit browser controller with enhanced navigation and additional controls." 8 | s.homepage = "https://github.com/pitometsu/CruiserWebViewController" 9 | s.license = { :type => 'MIT', :file => 'LICENSE' } 10 | s.author = { "Ignacio Romero Z." => "iromero@dzen.cl", 11 | "Yuriy Pitomets V." => "pitometsu@gmail.com"} 12 | s.source = { :git => "https://github.com/pitometsu/CruiserWebViewController.git", 13 | :tag => "v#{s.version}" } 14 | 15 | s.platform = :ios, '8.0' 16 | s.requires_arc = true 17 | 18 | s.source_files = 'Source/Classes/*.{h,m}' 19 | s.resources = 'Source/Resources/*.*' 20 | s.framework = 'UIKit', 'WebKit' 21 | s.dependency 'IPSqueezableViewController', '>= 0.0.2' 22 | end 23 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Local Podspecs/CruiserWebViewController.podspec: -------------------------------------------------------------------------------- 1 | 2 | @version = "7.0" 3 | 4 | Pod::Spec.new do |s| 5 | s.name = "CruiserWebViewController" 6 | s.version = @version 7 | s.summary = "Yet another one WebKit browser controller with enhanced navigation and additional controls." 8 | s.homepage = "https://github.com/pitometsu/CruiserWebViewController" 9 | s.license = { :type => 'MIT', :file => 'LICENSE' } 10 | s.author = { "Ignacio Romero Z." => "iromero@dzen.cl", 11 | "Yuriy Pitomets V." => "pitometsu@gmail.com"} 12 | s.source = { :git => "https://github.com/pitometsu/CruiserWebViewController.git", 13 | :tag => "v#{s.version}" } 14 | 15 | s.platform = :ios, '8.0' 16 | s.requires_arc = true 17 | 18 | s.source_files = 'Source/Classes/*.{h,m}' 19 | s.resources = 'Source/Resources/*.*' 20 | s.framework = 'UIKit', 'WebKit' 21 | s.dependency 'IPSqueezableViewController', '>= 0.0.2' 22 | end 23 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2014 Yi-Cheng Chang (http://github.com/zetachang) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Based on DZNWebViewController by (c) 2014 Ignacio Romero Zurbuchen, DZN Labs, iromero@dzen.cl 4 | Copyright (c) 2015 Yuriy Pitomets, pitometsu@gmail.com 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 7 | 8 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 9 | 10 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 11 | -------------------------------------------------------------------------------- /Source/Classes/CruiserWebView.h: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebView.h 3 | // CruiserWebViewController 4 | // https://github.com/dzenbot/CruiserWebViewController 5 | // 6 | // Created by Ignacio Romero Zurbuchen on 11/21/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | #import 14 | 15 | 16 | @protocol CruiserNavigationDelegate; 17 | 18 | 19 | @interface CruiserWebView : WKWebView 20 | 21 | @property (nonatomic, weak) id navDelegate; 22 | 23 | @end 24 | 25 | 26 | // CruiserNavigationDelegate 27 | @protocol CruiserNavigationDelegate 28 | 29 | - (void)webView:(CruiserWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation; 30 | - (void)webView:(CruiserWebView *)webView didCommitNavigation:(WKNavigation *)navigation; 31 | - (void)webView:(CruiserWebView *)webView didUpdateProgress:(CGFloat)progress; 32 | - (void)webView:(CruiserWebView *)webView didFinishNavigation:(WKNavigation *)navigation; 33 | - (void)webView:(CruiserWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error; 34 | 35 | @end 36 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Classes/IPNavBarSqueezableViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // IPNavBarSqueezableViewController.h 3 | // iPTT 4 | // 5 | // Created by zeta on 13/10/19. 6 | // Copyright (c) 2013年 shotdoor. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | 12 | @interface IPNavBarSqueezableViewController : UIViewController 13 | 14 | @property (nonatomic, weak) IBOutlet UIScrollView *triggeringScrollView; 15 | 16 | @property (nonatomic, strong) UIFont *titleFont; 17 | @property (nonatomic, strong) UIColor *titleColor; 18 | 19 | @property (nonatomic, copy) void (^squeezeCompletion)(void); // nil by default 20 | @property (nonatomic, copy) void (^expandCompletion)(void); // nil by default 21 | 22 | // inheritance 23 | - (void)processBars NS_REQUIRES_SUPER; 24 | - (void)squeezeBars NS_REQUIRES_SUPER; 25 | - (void)expandBars NS_REQUIRES_SUPER; 26 | 27 | - (NSString *)squeezedTitle:(NSString *)title; // @"[ %@ ]" by default 28 | 29 | #pragma mark - Scroll View Delegate 30 | 31 | - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView NS_REQUIRES_SUPER; 32 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView NS_REQUIRES_SUPER; 33 | - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 34 | withVelocity:(CGPoint)velocity 35 | targetContentOffset:(inout CGPoint *)targetContentOffset NS_REQUIRES_SUPER; 36 | - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView NS_REQUIRES_SUPER; 37 | 38 | @end 39 | -------------------------------------------------------------------------------- /Examples/Sample/Sample.xcodeproj/project.xcworkspace/xcshareddata/Sample.xccheckout: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDESourceControlProjectFavoriteDictionaryKey 6 | 7 | IDESourceControlProjectIdentifier 8 | 6C593AE3-83A1-44CB-BFB2-7D7ECC743A4B 9 | IDESourceControlProjectName 10 | Sample 11 | IDESourceControlProjectOriginsDictionary 12 | 13 | D311AB8C174840A4EE4A47EBDC7C8F65527E0B7B 14 | github.com:Pitometsu/CruiserWebViewController.git 15 | 16 | IDESourceControlProjectPath 17 | Examples/Sample/Sample.xcodeproj 18 | IDESourceControlProjectRelativeInstallPathDictionary 19 | 20 | D311AB8C174840A4EE4A47EBDC7C8F65527E0B7B 21 | ../../../.. 22 | 23 | IDESourceControlProjectURL 24 | github.com:Pitometsu/CruiserWebViewController.git 25 | IDESourceControlProjectVersion 26 | 111 27 | IDESourceControlProjectWCCIdentifier 28 | D311AB8C174840A4EE4A47EBDC7C8F65527E0B7B 29 | IDESourceControlProjectWCConfigurations 30 | 31 | 32 | IDESourceControlRepositoryExtensionIdentifierKey 33 | public.vcs.git 34 | IDESourceControlWCCIdentifierKey 35 | D311AB8C174840A4EE4A47EBDC7C8F65527E0B7B 36 | IDESourceControlWCCName 37 | CruiserWebViewController 38 | 39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/application.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function() { 2 | var group = []; 3 | $('.highlight').each(function() { 4 | group.push($(this)); 5 | 6 | if(!$(this).next().hasClass('highlight')) { 7 | var container = $('
'); 8 | container.insertBefore(group[0]); 9 | 10 | for (i in group) { 11 | group[i].appendTo(container); 12 | } 13 | 14 | group = []; 15 | } 16 | }); 17 | 18 | $('.highlight-group').each(function() { 19 | var languages = []; 20 | $(this).find($("code")).each(function() { 21 | languages.push($(this).data('lang')); 22 | }); 23 | 24 | $(this).children(".highlight:not(:first-child)").hide(); 25 | 26 | var span = $(''); 27 | for (i in languages) { 28 | var language = languages[i]; 29 | var a = $('' + language.toProperCase() + ''); 30 | if (i == 0) { 31 | a.addClass('active'); 32 | } 33 | span.append(a); 34 | } 35 | 36 | $(this).prepend(span); 37 | }); 38 | 39 | $('a[data-lang]').on('click', function() { 40 | var lang = $(this).data('lang'); 41 | $(this).siblings('a').removeClass('active'); 42 | $(this).addClass('active'); 43 | $(this).parent().siblings('.highlight').each(function() { 44 | if ($(this).find('code').data('lang') === lang) { 45 | $(this).show(); 46 | } else { 47 | $(this).hide() 48 | } 49 | }); 50 | }); 51 | }); 52 | 53 | String.prototype.toProperCase = function () { 54 | return this.replace(/\b\w+/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();}); 55 | }; 56 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/README.md: -------------------------------------------------------------------------------- 1 | # IPSqueezableViewController 2 | 3 | **Condensing effect of navigation bar as the one in Safari.app** 4 | 5 | Though iOS 8 introduce the `condensesBarsOnSwipe` property. It's still not the same as the one we see in Safari.app. 6 | 7 | ## Demo 8 | 9 | | Safari | IPSqueezableViewController | 10 | | ------------- | --------------------------- | 11 | | ![](https://raw.githubusercontent.com/zetachang/IPSqueezableViewController/master/Demo/demo-safari.gif) | ![](https://raw.githubusercontent.com/zetachang/IPSqueezableViewController/master/Demo/demo.gif) | 12 | 13 | ## Installation 14 | 15 | [CocoaPods](http://cocoapods.org) is the recommended method to install. Simply add the following line to your `Podfile`: 16 | 17 | #### Podfile 18 | 19 | ```ruby 20 | pod 'IPSqueezableViewController' 21 | ``` 22 | 23 | ## Usage 24 | 25 | 1. Make your view controller inherit `IPSqueezableViewController`. 26 | 2. Set up the `triggeringScrollView` property as the scrollview you want to trigger the condensing effect. 27 | 3. Set up `ip_rightNavBarItem` property to the bar button item you want to show as the right bar button item of the view controller. 28 | 4. See `Demo/IPSqueezableViewController.xcodepro` for example. 29 | 30 | ## Requirements 31 | 32 | * The subclass of IPSqueezableViewController must be contained in a `UINavigationController` and **cannot** be the `topViewController` of a `UINavigationController`. 33 | 34 | ## Contributions 35 | 36 | Suggestions or PR are welcome :-) 37 | 38 | ## Contact 39 | 40 | [David Chang](http://github.com/zetachang) 41 | [@zetachang](https://twitter.com/zetachang) 42 | 43 | ## License 44 | 45 | In short, IPSqueezableViewController is available under the MIT license. See the LICENSE file for more info. 46 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/Sample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | cl.dzn.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UILaunchStoryboardName 28 | Launch Screen 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationLandscapeLeft 43 | UIInterfaceOrientationLandscapeRight 44 | UIInterfaceOrientationPortraitUpsideDown 45 | 46 | UIViewControllerBasedStatusBarAppearance 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /Source/Classes/CruiserPolyActivity.h: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserPolyActivity.h 3 | // CruiserWebViewController 4 | // https://github.com/dzenbot/CruiserWebViewController 5 | // 6 | // Created by Ignacio Romero Zurbuchen on 3/28/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | #import 14 | 15 | /** 16 | Types of activity kind, used for polymorphic creation. 17 | */ 18 | typedef NS_OPTIONS(NSUInteger, CruiserPolyActivityType) { 19 | CruiserPolyActivityTypeLink, 20 | CruiserPolyActivityTypeSafari, 21 | CruiserPolyActivityTypeChrome, 22 | CruiserPolyActivityTypeOpera, 23 | CruiserPolyActivityTypeDolphin 24 | }; 25 | 26 | /** 27 | The CruiserPolyActivity class is an abstract subclass of UIActivity allowing to easily create polymorphic instances by assigning different activity types. Each type will render a different icon and title, and will perform different actions too. 28 | */ 29 | @interface CruiserPolyActivity : UIActivity 30 | 31 | @property (nonatomic, readonly) CruiserPolyActivityType type; 32 | @property (nonatomic, readonly) NSURL *URL; 33 | 34 | /** 35 | Initializes and returns a newly created activity with a specific type. 36 | 37 | @param type The type of the activity to be created. 38 | @returns The initialized activity. 39 | */ 40 | - (instancetype)initWithActivityType:(CruiserPolyActivityType)type; 41 | 42 | /** 43 | Allocates a new instance of the receiving class, sends it an init message, and returns the initialized object. 44 | This method implements the same logic than initWithActivityType: but is just shorter to call. 45 | 46 | @param type The type of the activity to be created. 47 | */ 48 | + (instancetype)activityWithType:(CruiserPolyActivityType)type; 49 | 50 | @end 51 | -------------------------------------------------------------------------------- /Source/Classes/CruiserWebView.m: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebView.h 3 | // CruiserWebViewController 4 | // https://github.com/dzenbot/CruiserWebViewController 5 | // 6 | // Created by Ignacio Romero Zurbuchen on 11/21/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | #import "CruiserWebView.h" 14 | 15 | 16 | @implementation CruiserWebView 17 | 18 | #pragma mark - Setters 19 | 20 | - (void)setNavDelegate:(id)delegate 21 | { 22 | if (!delegate || (self.navDelegate && ![self.navDelegate isEqual:delegate])) { 23 | [self removeObserver:self 24 | forKeyPath:NSStringFromSelector(@selector(estimatedProgress))]; 25 | } 26 | if (delegate) { 27 | [self addObserver:self 28 | forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) 29 | options:NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew 30 | context:NULL]; 31 | } 32 | _navDelegate = delegate; 33 | 34 | [super setNavigationDelegate:delegate]; 35 | } 36 | 37 | 38 | #pragma mark - Key Value Observer 39 | 40 | - (void)observeValueForKeyPath:(NSString *)keyPath 41 | ofObject:(id)object 42 | change:(NSDictionary *)change 43 | context:(void *)context 44 | { 45 | if ([object isEqual:self] && [keyPath isEqualToString:NSStringFromSelector(@selector(estimatedProgress))]) { 46 | if (self.navDelegate && [self.navDelegate respondsToSelector:@selector(webView:didUpdateProgress:)]) { 47 | [self.navDelegate webView:self 48 | didUpdateProgress:self.estimatedProgress]; 49 | } 50 | } else { 51 | [super observeValueForKeyPath:keyPath 52 | ofObject:object 53 | change:change 54 | context:context]; 55 | } 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## CruiserWebViewController 5 | 6 | The MIT License (MIT) 7 | 8 | Based on DZNWebViewController by (c) 2014 Ignacio Romero Zurbuchen, DZN Labs, iromero@dzen.cl 9 | Copyright (c) 2015 Yuriy Pitomets, pitometsu@gmail.com 10 | 11 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 16 | 17 | 18 | ## IPSqueezableViewController 19 | 20 | Copyright (c) 2014 Yi-Cheng Chang (http://github.com/zetachang) 21 | 22 | Permission is hereby granted, free of charge, to any person obtaining a copy 23 | of this software and associated documentation files (the "Software"), to deal 24 | in the Software without restriction, including without limitation the rights 25 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 26 | copies of the Software, and to permit persons to whom the Software is 27 | furnished to do so, subject to the following conditions: 28 | 29 | The above copyright notice and this permission notice shall be included in 30 | all copies or substantial portions of the Software. 31 | 32 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 33 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 34 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 35 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 36 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 37 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 38 | THE SOFTWARE. 39 | Generated by CocoaPods - http://cocoapods.org 40 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Sample 4 | // 5 | // Created by Ignacio on 3/27/14. 6 | // Improved by Yuriy Pitomets on 23/01/2015 7 | // Copyright (c) 2014 DZN Labs. All rights reserved. 8 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 9 | // 10 | 11 | #import "AppDelegate.h" 12 | #import "CruiserWebViewController.h" 13 | 14 | #define DEBUG_LOCAL 0 15 | 16 | @implementation AppDelegate 17 | 18 | - (BOOL) application:(UIApplication *)application 19 | didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 20 | { 21 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 22 | 23 | #if DEBUG_LOCAL 24 | NSString *path = [[NSBundle mainBundle] pathForResource:@"NSHipster.com" 25 | ofType:@"html"]; 26 | ViewController *controller = [[ViewController alloc] initWithFileURL:[NSURL fileURLWithPath:path]]; 27 | UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 28 | self.window.rootViewController = navController; 29 | #else 30 | CruiserWebViewController *controller = [[CruiserWebViewController alloc] initWithURL: 31 | [NSURL URLWithString:@"http://appcruiser.com/welcome"]]; 32 | UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller]; 33 | UITextField *addressField = [[UITextField alloc] initWithFrame:CGRectMake(10, 11, 355, 25)]; 34 | addressField.delegate = controller; 35 | addressField.borderStyle = UITextBorderStyleRoundedRect; 36 | addressField.backgroundColor = UIColor.whiteColor; 37 | addressField.textAlignment = NSTextAlignmentCenter; 38 | addressField.returnKeyType = UIReturnKeyGo; 39 | addressField.keyboardType = UIKeyboardTypeWebSearch; 40 | addressField.clearButtonMode = UITextFieldViewModeWhileEditing; 41 | addressField.rightViewMode = UITextFieldViewModeUnlessEditing; 42 | addressField.leftViewMode = UITextFieldViewModeAlways; 43 | addressField.autocapitalizationType = UITextAutocapitalizationTypeNone; 44 | addressField.autocorrectionType = UITextAutocorrectionTypeNo; 45 | addressField.adjustsFontSizeToFitWidth = YES; 46 | addressField.minimumFontSize = 6.f; 47 | controller.navigationItem.titleView = addressField; 48 | controller.addressField = addressField; 49 | self.window.rootViewController = navController; 50 | #endif 51 | 52 | self.window.backgroundColor = [UIColor whiteColor]; 53 | [self.window makeKeyAndVisible]; 54 | 55 | return YES; 56 | } 57 | 58 | @end 59 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/embed.js: -------------------------------------------------------------------------------- 1 | var Swiftype = window.Swiftype || {}; 2 | Swiftype.root_url = Swiftype.root_url || "//api.swiftype.com"; 3 | Swiftype.embedVersion = Swiftype.embedVersion || 'v1'; 4 | if (typeof Swiftype.renderStyle === 'undefined') { 5 | Swiftype.renderStyle = 'nocode'; 6 | } 7 | 8 | Swiftype.isMobile = function() { 9 | var ua = window.navigator.userAgent; 10 | if(/iPhone|iPod/.test(ua) && ua.indexOf("AppleWebKit") > -1 ) { 11 | return true; 12 | } 13 | if (/Android/.test(ua) && /Mobile/i.test(ua) && ua.indexOf("AppleWebKit") > -1 ) { 14 | return true; 15 | } 16 | return false; 17 | }; 18 | 19 | Swiftype.loadScript = function(url, callback) { 20 | var script = document.createElement('script'); 21 | script.type = 'text/javascript'; 22 | script.async = true; 23 | script.src = url; 24 | 25 | var entry = document.getElementsByTagName('script')[0]; 26 | entry.parentNode.insertBefore(script, entry); 27 | 28 | if (script.addEventListener) { 29 | script.addEventListener('load', callback, false); 30 | } else { 31 | script.attachEvent('onreadystatechange', function() { 32 | if (/complete|loaded/.test(script.readyState)) 33 | callback(); 34 | }); 35 | } 36 | }; 37 | 38 | Swiftype.loadStylesheet = function(url) { 39 | var link = document.createElement('link'); 40 | link.rel = 'stylesheet'; 41 | link.type = 'text/css'; 42 | link.href = url; 43 | (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(link); 44 | }; 45 | 46 | Swiftype.loadSupportingFiles = function(callback) { 47 | if (Swiftype.renderStyle === false) { 48 | Swiftype.loadScript("//s.swiftypecdn.com/assets/swiftype_no_render-6c64754ae91a4333da44d1dd74482f76.js", callback); 49 | Swiftype.loadStylesheet("//s.swiftypecdn.com/assets/swiftype-9261e170d74ef8347d54dc5ba07098ad.css"); 50 | } else if (Swiftype.isMobile() && !Swiftype.disableMobileOverlay) { 51 | Swiftype.loadScript("//s.swiftypecdn.com/assets/swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js", callback); 52 | Swiftype.loadStylesheet("//s.swiftypecdn.com/assets/swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css"); 53 | } else if (Swiftype.renderStyle === 'inline' || Swiftype.renderStyle === 'new_page') { 54 | Swiftype.loadScript("//s.swiftypecdn.com/assets/swiftype_onpage-3af7306276568b2e98812313e55587e3.js", callback); 55 | Swiftype.loadStylesheet("//s.swiftypecdn.com/assets/swiftype-9261e170d74ef8347d54dc5ba07098ad.css"); 56 | } else { 57 | Swiftype.loadScript("//s.swiftypecdn.com/assets/swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js", callback); 58 | Swiftype.loadStylesheet("//s.swiftypecdn.com/assets/swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css"); 59 | } 60 | }; 61 | 62 | var Swiftype = (function(window, undefined) { 63 | if (Swiftype.embedVersion === 'v1') { 64 | Swiftype.loadSupportingFiles(function(){}); 65 | } 66 | return Swiftype; 67 | })(window); 68 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | The MIT License (MIT) 18 | 19 | Based on DZNWebViewController by (c) 2014 Ignacio Romero Zurbuchen, DZN Labs, iromero@dzen.cl 20 | Copyright (c) 2015 Yuriy Pitomets, pitometsu@gmail.com 21 | 22 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 23 | 24 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 25 | 26 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27 | 28 | Title 29 | CruiserWebViewController 30 | Type 31 | PSGroupSpecifier 32 | 33 | 34 | FooterText 35 | Copyright (c) 2014 Yi-Cheng Chang (http://github.com/zetachang) 36 | 37 | Permission is hereby granted, free of charge, to any person obtaining a copy 38 | of this software and associated documentation files (the "Software"), to deal 39 | in the Software without restriction, including without limitation the rights 40 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 41 | copies of the Software, and to permit persons to whom the Software is 42 | furnished to do so, subject to the following conditions: 43 | 44 | The above copyright notice and this permission notice shall be included in 45 | all copies or substantial portions of the Software. 46 | 47 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 48 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 49 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 50 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 51 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 52 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 53 | THE SOFTWARE. 54 | Title 55 | IPSqueezableViewController 56 | Type 57 | PSGroupSpecifier 58 | 59 | 60 | FooterText 61 | Generated by CocoaPods - http://cocoapods.org 62 | Title 63 | 64 | Type 65 | PSGroupSpecifier 66 | 67 | 68 | StringsTable 69 | Acknowledgements 70 | Title 71 | Acknowledgements 72 | 73 | 74 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/Launch Screen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 23 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | CruiserWebViewController 7.0 [![License](http://img.shields.io/badge/license-MIT-blue.svg)](http://opensource.org/licenses/MIT) 2 | ============================ 3 | 4 | [![Payoneer donate button](https://img.shields.io/badge/payoneer-donate-yellow.svg)](https://load.payoneer.com/LoadToPage.aspx?email=pitometsu@gmail.com) 5 | [![Pod Version](http://img.shields.io/cocoapods/v/CruiserWebViewController.svg)](https://cocoadocs.org/docsets/CruiserWebViewController) 6 | [![Pod Platform](http://img.shields.io/cocoapods/p/CruiserWebViewController.svg?style=flat)](http://cocoadocs.org/docsets/CruiserWebViewController/) 7 | [![Pod License](http://img.shields.io/cocoapods/l/CruiserWebViewController.svg?style=flat)](https://github.com/Pitometsu/CruiserWebViewController/blob/master/LICENSE) 8 | [![Dependency Status](https://www.versioneye.com/objective-c/cruiserwebviewcontroller/7.0/badge.svg?style=flat)](https://www.versioneye.com/objective-c/cruiserwebviewcontroller) 9 | [![Reference Status](https://www.versioneye.com/objective-c/cruiserwebviewcontroller/reference_badge.svg?style=flat)](https://www.versioneye.com/objective-c/cruiserwebviewcontroller/references) 10 | 11 | [![Build Status](http://img.shields.io/travis/Pitometsu/CruiserWebViewController/master.svg?style=flat)](https://travis-ci.org/Pitometsu/CruiserWebViewController) 12 | [![Coverage Status](https://coveralls.io/repos/pitometsu/CruiserWebViewController/badge.png?branch=master)](https://coveralls.io/r/pitometsu/CruiserWebViewController?branch=master) 13 | [![Codacy Badge](https://www.codacy.com/project/badge/25cb5d1410c7497cb057d887d1f3ea23)](https://www.codacy.com/public/Pitometsu/CruiserWebViewController.git) 14 | [![Code Climate](https://codeclimate.com/github/Pitometsu/CruiserWebViewController/badges/gpa.svg)](https://codeclimate.com/github/Pitometsu/CruiserWebViewController) 15 | ![Issue](http://issuestats.com/github/pitometsu/CruiserWebViewController/badge/issue) 16 | 17 | 18 | iOS view controller component. 19 | Yet another one WebKit browser controller with enhanced navigation and additional controls. 20 | Designed to be integrated via storyboard. 21 | 22 | Including: 23 | - smart address bar 24 | - 3 customizable top tab bar items 25 | - navigation buttons on bottom bar 26 | 27 | ![CruiserWebViewController](Docs/CruiserWebViewController_screenshot.png) 28 | 29 | ### Features 30 | 31 | * Load HTTP links or local HTML. 32 | * Navigation tools: backward/foward/anchor/down/up. 33 | * Dragging gestures for back/forward, like Safari app. 34 | * Progress bar embeded on the navigation bar or activity indicator (optional). 35 | * Hide top and bottom bars when scrolling, like Safari app (optional). 36 | * Contextual features: share link, copy link, read later. 37 | * Customizable toolbar icons. 38 | 39 | ### Supports 40 | 41 | * Portrait/Landscape 42 | * Localization 43 | * iPhone/iPad 44 | * Retina & iPad6+ displays 45 | * iOS8+ only 46 | * Storyboard 47 | * Autolayout 48 | * ARC 49 | 50 | ## Installation 51 | 52 | Available in [Cocoa Pods](http://cocoapods.org/?q=CruiserWebViewController) 53 | 54 | ``` 55 | pod 'CruiserWebViewController' 56 | ``` 57 | 58 | If you're importing the source files manually, you must add the `WebKit` framework to your project. 59 | 60 | ## How to use 61 | 62 | Create UIViewController in Storyboard and set all IBOutlets. 63 | 64 | ## License 65 | 66 | (The MIT License) 67 | 68 | Based on [DZNWebViewController](https://www.cocoacontrols.com/controls/dznwebviewcontroller) by (c) 2014 Ignacio Romero Zurbuchen 69 | Copyright (c) 2015 Yuriy Pitomets 70 | 71 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 72 | 73 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 74 | 75 | THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 76 | -------------------------------------------------------------------------------- /Source/Classes/CruiserPolyActivity.m: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserPolyActivity.m 3 | // CruiserWebViewController 4 | // https://github.com/dzenbot/CruiserWebViewController 5 | // 6 | // Created by Ignacio Romero Zurbuchen on 3/28/14. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | #import "CruiserPolyActivity.h" 14 | 15 | @implementation CruiserPolyActivity 16 | 17 | + (instancetype)activityWithType:(CruiserPolyActivityType)type 18 | { 19 | return [[CruiserPolyActivity alloc] initWithActivityType:type]; 20 | } 21 | 22 | - (instancetype)initWithActivityType:(CruiserPolyActivityType)type 23 | { 24 | self = [super init]; 25 | if (self) { 26 | _type = type; 27 | } 28 | return self; 29 | } 30 | 31 | 32 | #pragma mark - Getter methods 33 | 34 | + (UIActivityCategory)activityCategory 35 | { 36 | return UIActivityCategoryAction; 37 | } 38 | 39 | - (NSString *)activityType 40 | { 41 | switch (self.type) { 42 | case CruiserPolyActivityTypeLink: return @"com.appcruiser.CruiserWebViewController.activity.CopyLink"; 43 | case CruiserPolyActivityTypeSafari: return @"com.appcruiser.CruiserWebViewController.activity.OpenInSafari"; 44 | case CruiserPolyActivityTypeChrome: return @"com.appcruiser.CruiserWebViewController.activity.OpenInChrome"; 45 | case CruiserPolyActivityTypeOpera: return @"com.appcruiser.CruiserWebViewController.activity.OpenInOperaMini"; 46 | case CruiserPolyActivityTypeDolphin: return @"com.appcruiser.CruiserWebViewController.activity.OpenInDolphin"; 47 | } 48 | } 49 | 50 | - (NSString *)activityTitle 51 | { 52 | switch (self.type) { 53 | case CruiserPolyActivityTypeLink: return NSLocalizedString(@"Copy Link", nil); 54 | case CruiserPolyActivityTypeSafari: return NSLocalizedString(@"Open in Safari", nil); 55 | case CruiserPolyActivityTypeChrome: return NSLocalizedString(@"Open in Chrome", nil); 56 | case CruiserPolyActivityTypeOpera: return NSLocalizedString(@"Open in Opera", nil); 57 | case CruiserPolyActivityTypeDolphin: return NSLocalizedString(@"Open in Dolphin", nil); 58 | } 59 | } 60 | 61 | - (UIImage *)activityImage 62 | { 63 | switch (self.type) { 64 | case CruiserPolyActivityTypeLink: return [UIImage imageNamed:@"cruiser_icn_activity_link"]; 65 | case CruiserPolyActivityTypeSafari: return [UIImage imageNamed:@"cruiser_icn_activity_safari"]; 66 | case CruiserPolyActivityTypeChrome: return [UIImage imageNamed:@"cruiser_icn_activity_chrome"]; 67 | case CruiserPolyActivityTypeOpera: return [UIImage imageNamed:@"cruiser_icn_activity_opera"]; 68 | case CruiserPolyActivityTypeDolphin: return [UIImage imageNamed:@"cruiser_icn_activity_dolphin"]; 69 | default: return nil; 70 | } 71 | } 72 | 73 | - (NSURL *)chromeURLWithURL:(NSURL *)URL 74 | { 75 | return [self customURLWithURL:URL andType:CruiserPolyActivityTypeChrome]; 76 | } 77 | 78 | - (NSURL *)operaURLWithURL:(NSURL *)URL 79 | { 80 | return [self customURLWithURL:URL andType:CruiserPolyActivityTypeOpera]; 81 | } 82 | 83 | - (NSURL *)dolphinURLWithURL:(NSURL *)URL 84 | { 85 | return [self customURLWithURL:URL andType:CruiserPolyActivityTypeDolphin]; 86 | } 87 | 88 | - (NSURL *)customURLWithURL:(NSURL *)URL andType:(CruiserPolyActivityType)type 89 | { 90 | // Replaces the URL Scheme with the type equivalent. 91 | NSString *scheme = nil; 92 | if ([URL.scheme isEqualToString:@"http"]) { 93 | if (type == CruiserPolyActivityTypeChrome) scheme = @"googlechrome"; 94 | if (type == CruiserPolyActivityTypeOpera) scheme = @"ohttp"; 95 | if (type == CruiserPolyActivityTypeDolphin) scheme = @"dolphin"; 96 | } 97 | else if ([URL.scheme isEqualToString:@"https"]) { 98 | if (type == CruiserPolyActivityTypeChrome) scheme = @"googlechromes"; 99 | if (type == CruiserPolyActivityTypeOpera) scheme = @"ohttps"; 100 | if (type == CruiserPolyActivityTypeDolphin) scheme = @"dolphin"; 101 | } 102 | 103 | // Proceeds only if a valid URI Scheme is available. 104 | if (scheme) { 105 | NSRange range = [[URL absoluteString] rangeOfString:@":"]; 106 | NSString *urlNoScheme = [[URL absoluteString] substringFromIndex:range.location]; 107 | return [NSURL URLWithString:[scheme stringByAppendingString:urlNoScheme]]; 108 | } 109 | 110 | return nil; 111 | } 112 | 113 | - (BOOL)canPerformWithActivityItems:(NSArray *)activityItems 114 | { 115 | for (UIActivity *item in activityItems) { 116 | 117 | if ([item isKindOfClass:[NSString class]]) { 118 | 119 | NSURL *URL = [NSURL URLWithString:(NSString *)item]; 120 | if (!URL) continue; 121 | 122 | if (self.type == CruiserPolyActivityTypeLink) { 123 | return URL ? YES : NO; 124 | } 125 | if (self.type == CruiserPolyActivityTypeSafari) { 126 | return [[UIApplication sharedApplication] canOpenURL:URL]; 127 | } 128 | if (self.type == CruiserPolyActivityTypeChrome) { 129 | return [[UIApplication sharedApplication] canOpenURL:[self chromeURLWithURL:URL]]; 130 | } 131 | if (self.type == CruiserPolyActivityTypeOpera) { 132 | return [[UIApplication sharedApplication] canOpenURL:[self operaURLWithURL:URL]]; 133 | } 134 | if (self.type == CruiserPolyActivityTypeDolphin) { 135 | return [[UIApplication sharedApplication] canOpenURL:[self dolphinURLWithURL:URL]]; 136 | } 137 | 138 | break; 139 | } 140 | } 141 | 142 | return NO; 143 | } 144 | 145 | - (void)prepareWithActivityItems:(NSArray *)activityItems 146 | { 147 | for (id item in activityItems) { 148 | 149 | if ([item isKindOfClass:[NSString class]]) { 150 | _URL = [NSURL URLWithString:(NSString *)item]; 151 | if (!self.URL) continue; 152 | else break; 153 | } 154 | } 155 | } 156 | 157 | - (void)performActivity 158 | { 159 | BOOL completed = NO; 160 | 161 | if (!self.URL) { 162 | [self activityDidFinish:completed]; 163 | return; 164 | } 165 | 166 | switch (self.type) { 167 | case CruiserPolyActivityTypeLink: 168 | [[UIPasteboard generalPasteboard] setURL:self.URL]; 169 | completed = YES; 170 | break; 171 | case CruiserPolyActivityTypeSafari: 172 | completed = [[UIApplication sharedApplication] openURL:self.URL]; 173 | break; 174 | case CruiserPolyActivityTypeChrome: 175 | completed = [[UIApplication sharedApplication] openURL:[self chromeURLWithURL:self.URL]]; 176 | break; 177 | case CruiserPolyActivityTypeOpera: 178 | completed = [[UIApplication sharedApplication] openURL:[self operaURLWithURL:self.URL]]; 179 | break; 180 | case CruiserPolyActivityTypeDolphin: 181 | completed = [[UIApplication sharedApplication] openURL:[self dolphinURLWithURL:self.URL]]; 182 | break; 183 | } 184 | 185 | [self activityDidFinish:completed]; 186 | } 187 | 188 | @end 189 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/Target Support Files/Pods/Pods-resources.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | 4 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 5 | 6 | RESOURCES_TO_COPY=${PODS_ROOT}/resources-to-copy-${TARGETNAME}.txt 7 | > "$RESOURCES_TO_COPY" 8 | 9 | install_resource() 10 | { 11 | case $1 in 12 | *.storyboard) 13 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 14 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .storyboard`.storyboardc" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 15 | ;; 16 | *.xib) 17 | echo "ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile ${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib ${PODS_ROOT}/$1 --sdk ${SDKROOT}" 18 | ibtool --reference-external-strings-file --errors --warnings --notices --output-format human-readable-text --compile "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename \"$1\" .xib`.nib" "${PODS_ROOT}/$1" --sdk "${SDKROOT}" 19 | ;; 20 | *.framework) 21 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 22 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 23 | echo "rsync -av ${PODS_ROOT}/$1 ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 24 | rsync -av "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 25 | ;; 26 | *.xcdatamodel) 27 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1"`.mom\"" 28 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodel`.mom" 29 | ;; 30 | *.xcdatamodeld) 31 | echo "xcrun momc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd\"" 32 | xcrun momc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcdatamodeld`.momd" 33 | ;; 34 | *.xcmappingmodel) 35 | echo "xcrun mapc \"${PODS_ROOT}/$1\" \"${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm\"" 36 | xcrun mapc "${PODS_ROOT}/$1" "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/`basename "$1" .xcmappingmodel`.cdm" 37 | ;; 38 | *.xcassets) 39 | ;; 40 | /*) 41 | echo "$1" 42 | echo "$1" >> "$RESOURCES_TO_COPY" 43 | ;; 44 | *) 45 | echo "${PODS_ROOT}/$1" 46 | echo "${PODS_ROOT}/$1" >> "$RESOURCES_TO_COPY" 47 | ;; 48 | esac 49 | } 50 | install_resource "../../../Source/Resources/cruiser_icn_activity_chrome@2x.png" 51 | install_resource "../../../Source/Resources/cruiser_icn_activity_chrome@2x~ipad.png" 52 | install_resource "../../../Source/Resources/cruiser_icn_activity_dolphin@2x.png" 53 | install_resource "../../../Source/Resources/cruiser_icn_activity_dolphin@2x~ipad.png" 54 | install_resource "../../../Source/Resources/cruiser_icn_activity_link@2x.png" 55 | install_resource "../../../Source/Resources/cruiser_icn_activity_link@2x~ipad.png" 56 | install_resource "../../../Source/Resources/cruiser_icn_activity_opera@2x.png" 57 | install_resource "../../../Source/Resources/cruiser_icn_activity_opera@2x~ipad.png" 58 | install_resource "../../../Source/Resources/cruiser_icn_activity_safari@2x~ipad.png" 59 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_action.png" 60 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_action@2x.png" 61 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_action@3x.png" 62 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_backward.png" 63 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_backward@2x.png" 64 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_backward@3x.png" 65 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_down.png" 66 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_down@2x.png" 67 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_down@3x.png" 68 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_face.png" 69 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_face@2x.png" 70 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_face@3x.png" 71 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_forward.png" 72 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_forward@2x.png" 73 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_forward@3x.png" 74 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_pin.png" 75 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_pin@2x.png" 76 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_pin@3x.png" 77 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_reload.png" 78 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_reload@2x.png" 79 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_reload@3x.png" 80 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_stop.png" 81 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_stop@2x.png" 82 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_stop@3x.png" 83 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_up.png" 84 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_up@2x.png" 85 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_up@3x.png" 86 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_web.png" 87 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_web@2x.png" 88 | install_resource "../../../Source/Resources/cruiser_icn_toolbar_web@3x.png" 89 | install_resource "../../../Source/Resources/de.lproj" 90 | install_resource "../../../Source/Resources/en.lproj" 91 | install_resource "../../../Source/Resources/es.lproj" 92 | install_resource "IPSqueezableViewController/Resources/backButton.png" 93 | install_resource "IPSqueezableViewController/Resources/backButton@2x.png" 94 | install_resource "IPSqueezableViewController/Resources/invisibleBackButton.png" 95 | install_resource "IPSqueezableViewController/Resources/invisibleBackButton@2x.png" 96 | 97 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${CONFIGURATION_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 98 | if [[ "${ACTION}" == "install" ]]; then 99 | rsync -avr --copy-links --no-relative --exclude '*/.svn/*' --files-from="$RESOURCES_TO_COPY" / "${INSTALL_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 100 | fi 101 | rm -f "$RESOURCES_TO_COPY" 102 | 103 | if [[ -n "${WRAPPER_EXTENSION}" ]] && [ "`xcrun --find actool`" ] && [ `find . -name '*.xcassets' | wc -l` -ne 0 ] 104 | then 105 | case "${TARGETED_DEVICE_FAMILY}" in 106 | 1,2) 107 | TARGET_DEVICE_ARGS="--target-device ipad --target-device iphone" 108 | ;; 109 | 1) 110 | TARGET_DEVICE_ARGS="--target-device iphone" 111 | ;; 112 | 2) 113 | TARGET_DEVICE_ARGS="--target-device ipad" 114 | ;; 115 | *) 116 | TARGET_DEVICE_ARGS="--target-device mac" 117 | ;; 118 | esac 119 | find "${PWD}" -name "*.xcassets" -print0 | xargs -0 actool --output-format human-readable-text --notices --warnings --platform "${PLATFORM_NAME}" --minimum-deployment-target "${IPHONEOS_DEPLOYMENT_TARGET}" ${TARGET_DEVICE_ARGS} --compress-pngs --compile "${BUILT_PRODUCTS_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}" 120 | fi 121 | -------------------------------------------------------------------------------- /Source/Classes/CruiserWebViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // CruiserWebViewController.h 3 | // CruiserWebViewController 4 | // https://github.com/dzenbot/CruiserWebViewController 5 | // 6 | // Created by Ignacio Romero Zurbuchen on 10/25/13. 7 | // Improved by Yuriy Pitomets on 23/01/2015 8 | // Copyright (c) 2014 DZN Labs. All rights reserved. 9 | // Copyright (c) 2015 Yuriy Pitomets. No rights reserved. 10 | // Licence: MIT-Licence 11 | // 12 | 13 | #import "CruiserWebView.h" 14 | #import "IPNavBarSqueezableViewController.h" 15 | #import 16 | 17 | 18 | /** 19 | Types of supported search services. 20 | */ 21 | typedef NS_ENUM(NSUInteger, CruiserSearchService) { 22 | CruiserSearchServicePrimary, // Google.com by default 23 | CruiserSearchServiceAlternative // DuckDuckGo.com by default 24 | }; 25 | 26 | /** 27 | Types of supported navigation tools. 28 | */ 29 | typedef NS_OPTIONS(NSUInteger, CruiserWebNavigationTools) { 30 | CruiserWebNavigationToolAll = -1, 31 | CruiserWebNavigationToolNone = 0, 32 | CruiserWebNavigationToolBackward = 1 << 0, 33 | CruiserWebNavigationToolForward = 1 << 1, 34 | CruiserWebNavigationToolPin = 1 << 2, 35 | CruiserWebNavigationToolDown = 1 << 3, 36 | CruiserWebNavigationToolUp = 1 << 4 37 | }; 38 | 39 | /** 40 | Types of supported actions (i.e. Share & Copy link, Add to Reading List, Open in Safari/Chrome/Opera/Dolphin). 41 | */ 42 | typedef NS_OPTIONS(NSUInteger, CruiserSupportedWebActions) { 43 | CruiserWebActionAll = -1, 44 | CruiserWebActionNone = 0, 45 | CruiserSupportedWebActionshareLink = 1 << 0, 46 | CruiserWebActionCopyLink = 1 << 1, 47 | CruiserWebActionReadLater = 1 << 2, 48 | CruiserWebActionOpenSafari = 1 << 3, 49 | CruiserWebActionOpenChrome = 1 << 4, 50 | CruiserWebActionOpenOperaMini = 1 << 5, 51 | CruiserWebActionOpenDolphin = 1 << 6 52 | }; 53 | 54 | /** 55 | A very simple web browser with useful navigation and tooling features. 56 | */ 57 | @interface CruiserWebViewController : IPNavBarSqueezableViewController 62 | 63 | /** The web view that the controller manages. */ 64 | @property (nonatomic, strong) CruiserWebView *webView; 65 | /** The URL identifying the location of the content to load. */ 66 | @property (nonatomic, readwrite) NSURL *URL; 67 | /** The supported navigation tool bar items. Default is All. */ 68 | @property (nonatomic, readwrite) CruiserWebNavigationTools supportedWebNavigationTools; 69 | /** The supported actions like sharing and copy link, add to reading list, open in Safari, etc. Default is All. */ 70 | @property (nonatomic, readwrite) CruiserSupportedWebActions supportedWebActions; 71 | /** Yes if a progress bar indicates the . Default is YES. */ 72 | @property (nonatomic) BOOL showLoadingProgress; 73 | /** YES if long pressing the backward and forward buttons the navigation history is displayed. Default is YES. */ 74 | @property (nonatomic) BOOL allowHistory; 75 | /** YES if both, the navigation and tool bars should hide when panning vertically. Default is YES. */ 76 | @property (nonatomic) BOOL hideBarsWithGestures; 77 | 78 | ///------------------------------------------------ 79 | /// @name Initialization 80 | ///------------------------------------------------ 81 | 82 | /** 83 | Initializes and returns a newly created webview controller with an initial HTTP URL to be requested as soon as the view appears. 84 | 85 | @param URL The HTTP URL to be requested. 86 | @returns The initialized webview controller. 87 | */ 88 | - (instancetype)initWithURL:(NSURL *)URL; 89 | 90 | /** 91 | Initializes and returns a newly created webview controller for local HTML navigation. 92 | 93 | @param URL The file URL of the main html. 94 | @returns The initialized webview controller. 95 | */ 96 | - (instancetype)initWithFileURL:(NSURL *)URL; 97 | 98 | /** 99 | Starts loading a new request. Useful to programatically update the web content. 100 | 101 | @param URL The HTTP or file URL to be requested. 102 | */ 103 | - (void)loadURL:(NSURL *)URL NS_REQUIRES_SUPER; 104 | 105 | 106 | ///------------------------------------------------ 107 | /// @name UI outlets 108 | ///------------------------------------------------ 109 | 110 | // The text field for URL or Web search 111 | @property (nonatomic, weak) IBOutlet UITextField *addressField; 112 | 113 | 114 | ///------------------------------------------------ 115 | /// @name Appearance customisation 116 | ///------------------------------------------------ 117 | 118 | // The back button displayed on the tool bar (requieres CruiserWebNavigationToolBackward) 119 | @property (nonatomic, strong) UIImage *backwardButtonImage; 120 | // The forward button displayed on the tool bar (requieres CruiserWebNavigationToolForward) 121 | @property (nonatomic, strong) UIImage *forwardButtonImage; 122 | // The pin button displayed on the tool bar (requieres CruiserWebNavigationToolPin) 123 | @property (nonatomic, strong) UIImage *pinButtonImage; 124 | // The down button displayed on the tool bar (requieres CruiserWebNavigationToolDown) 125 | @property (nonatomic, strong) UIImage *downButtonImage; 126 | // The up button displayed on the tool bar (requieres CruiserWebNavigationToolUp) 127 | @property (nonatomic, strong) UIImage *upButtonImage; 128 | // The action button displayed on the navigation bar (requieres at least 1 CruiserSupportedWebActions value) 129 | @property (nonatomic, strong) UIImage *actionButtonImage; 130 | 131 | // The stop button displayed in addressField 132 | @property (nonatomic, strong) UIImage *stopButtonImage; 133 | // The reload button displayed in addressField 134 | @property (nonatomic, strong) UIImage *reloadButtonImage; 135 | // The button for first search service displayed in addressField 136 | @property (nonatomic, strong) UIImage *primarySearchButtonImage; 137 | // The button for second search service displayed in addressField 138 | @property (nonatomic, strong) UIImage *alternativeSearchButtonImage; 139 | 140 | 141 | ///------------------------------------------------ 142 | /// @name Search services 143 | ///------------------------------------------------ 144 | 145 | // String for request to primary search service 146 | @property (nonatomic, copy) NSString *primarySearchService; 147 | // String for request to alternative search service 148 | @property (nonatomic, copy) NSString *alternativeSearchService; 149 | 150 | ///------------------------------------------------ 151 | /// @name Navigation logic 152 | ///------------------------------------------------ 153 | 154 | // Load saved locations for web pages from user defaults 155 | - (void)loadPins; 156 | // Store all saved locations for web pages to user defaults 157 | - (void)storePins; 158 | 159 | 160 | ///------------------------------------------------ 161 | /// @name Delegate Methods Requiring Super 162 | ///------------------------------------------------ 163 | 164 | // CruiserNavigationDelegate 165 | - (void)webView:(CruiserWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; 166 | - (void)webView:(CruiserWebView *)webView didCommitNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; 167 | - (void)webView:(CruiserWebView *)webView didUpdateProgress:(CGFloat)progress NS_REQUIRES_SUPER; 168 | - (void)webView:(CruiserWebView *)webView didFinishNavigation:(WKNavigation *)navigation NS_REQUIRES_SUPER; 169 | - (void)webView:(CruiserWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error NS_REQUIRES_SUPER; 170 | 171 | // WKUIDelegate 172 | - (CruiserWebView *)webView:(CruiserWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures NS_REQUIRES_SUPER; 173 | 174 | // UITableViewDataSource 175 | - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView NS_REQUIRES_SUPER; 176 | - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section NS_REQUIRES_SUPER; 177 | - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath NS_REQUIRES_SUPER; 178 | - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath NS_REQUIRES_SUPER; 179 | 180 | // UITableViewDelegate 181 | - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath NS_REQUIRES_SUPER; 182 | 183 | 184 | ///------------------------------------------------ 185 | /// @name Toolbar Navigation Items Actions 186 | ///------------------------------------------------ 187 | 188 | - (void)goBackward:(id)sender; 189 | - (void)goForward:(id)sender; 190 | - (void)pinHere:(id)sender; 191 | - (void)scrollDown:(id)sender; 192 | - (void)scrollUp:(id)sender; 193 | - (void)switchSearchService:(id)sender; 194 | 195 | 196 | @end 197 | -------------------------------------------------------------------------------- /Examples/Sample/Pods/IPSqueezableViewController/Classes/IPNavBarSqueezableViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // IPNavBarSqueezableViewController.m 3 | // iPTT 4 | // 5 | // Created by zeta on 13/10/19. 6 | // Copyright (c) 2013年 shotdoor. All rights reserved. 7 | // 8 | 9 | #import "IPNavBarSqueezableViewController.h" 10 | 11 | /** 12 | Uncomment to debug 13 | */ 14 | // #define DEBUG_SQUEEZE 15 | 16 | #define SCREEN_WIDTH ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) \ 17 | || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) \ 18 | ? [[UIScreen mainScreen] bounds].size.width : [[UIScreen mainScreen] bounds].size.height) 19 | 20 | #define NAVBAR_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) \ 21 | || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? 44.f : 32.f) 22 | 23 | #define TOOLBAR_HEIGHT ((([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortrait) \ 24 | || ([UIApplication sharedApplication].statusBarOrientation == UIInterfaceOrientationPortraitUpsideDown)) ? 49.f : 32.f) 25 | 26 | 27 | static const CGFloat kSqueezedNavigationBarHeight = 20.f; 28 | static const CGFloat kStatusBarHeight = 20.f; 29 | static const NSTimeInterval kAnimationDuration = 0.25; 30 | 31 | 32 | typedef NS_ENUM(NSInteger, IPNavBarSqueezingStatus) { 33 | IPNavBarSqueezingStatusNormal, 34 | IPNavBarSqueezingStatusProgress, 35 | IPNavBarSqueezingStatusSqueezing, 36 | IPNavBarSqueezingStatusSqueezed, 37 | IPNavBarSqueezingStatusUnSqueezing 38 | }; 39 | 40 | 41 | @interface IPNavBarSqueezableViewController () 42 | 43 | @property (nonatomic) IPNavBarSqueezingStatus navBarStatus; 44 | @property (nonatomic, strong) UILabel *titleViewPlaceholder; // compact placeholder for title view 45 | @property (nonatomic, strong) UIView *titleViewOriginal; // original full size title view 46 | @property (nonatomic, strong) NSArray *leftBarButtonItems; 47 | @property (nonatomic, strong) NSArray *rightBarButtonItems; 48 | @property (nonatomic) BOOL dragStart; 49 | @property (nonatomic) CGFloat previousYOffset; 50 | @property (nonatomic, strong) UITapGestureRecognizer *recognizer; 51 | 52 | @end 53 | 54 | 55 | @implementation IPNavBarSqueezableViewController 56 | 57 | - (void)viewDidLoad 58 | { 59 | [super viewDidLoad]; 60 | // Set up scroll to squeeze 61 | self.navBarStatus = IPNavBarSqueezingStatusNormal; 62 | self.dragStart = NO; 63 | 64 | // Set up title view 65 | self.titleViewOriginal = self.navigationItem.titleView; 66 | self.titleViewPlaceholder = [[UILabel alloc] initWithFrame:CGRectMake(0.f, 0.f, 67 | SCREEN_WIDTH * 220.f / 320.f, 68 | kStatusBarHeight)]; 69 | self.titleViewPlaceholder.textAlignment = NSTextAlignmentCenter; 70 | self.titleViewPlaceholder.lineBreakMode = NSLineBreakByTruncatingTail; 71 | self.titleViewPlaceholder.textColor = self.titleColor ? self.titleColor 72 | : self.navigationController.navigationBar.tintColor; 73 | // Recognize tap on nav bar 74 | self.recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self 75 | action:@selector(navBarTapped:)]; 76 | self.recognizer.numberOfTapsRequired = 1; 77 | 78 | // Swipe to pop 79 | UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self 80 | action:@selector(swippedToPop:)]; 81 | recognizer.direction = UISwipeGestureRecognizerDirectionRight; 82 | [self.view addGestureRecognizer:recognizer]; 83 | 84 | [self.navigationController setToolbarHidden:NO 85 | animated:NO]; 86 | } 87 | 88 | - (void)swippedToPop:(id)sender 89 | { 90 | [self.navigationController popViewControllerAnimated:YES]; 91 | } 92 | 93 | - (void)viewWillAppear:(BOOL)animated 94 | { 95 | [super viewWillAppear:animated]; 96 | 97 | // Set up font 98 | if (!self.titleFont) { 99 | UIFont *navigationBarTitleFont = 100 | (UIFont *)self.navigationController.navigationBar.titleTextAttributes[NSFontAttributeName]; 101 | self.titleFont = navigationBarTitleFont ? [UIFont systemFontOfSize:navigationBarTitleFont.pointSize] 102 | : [UIFont systemFontOfSize:17.f]; 103 | } 104 | [self.transitionCoordinator animateAlongsideTransition: 105 | ^(id context) { 106 | if ([context presentationStyle] == UIModalPresentationNone){ 107 | self.titleViewPlaceholder.frame = CGRectOffset(self.titleViewPlaceholder.frame, -200.f, 0.f); 108 | } 109 | } completion:nil]; 110 | 111 | self.navigationItem.hidesBackButton = NO; 112 | self.navigationController.toolbarHidden = NO; 113 | 114 | self.triggeringScrollView.contentInset = UIEdgeInsetsMake(NAVBAR_HEIGHT + kStatusBarHeight, 115 | 0.f, 116 | TOOLBAR_HEIGHT, 117 | 0.f); 118 | } 119 | 120 | - (void)viewWillDisappear:(BOOL)animated 121 | { 122 | [super viewWillDisappear:animated]; 123 | 124 | // Unsqueeze manually 125 | self.navigationController.navigationBar.frame = CGRectMake(0.f, 126 | kStatusBarHeight, 127 | SCREEN_WIDTH, 128 | NAVBAR_HEIGHT); 129 | [self.navigationController.navigationBar removeGestureRecognizer:self.recognizer]; 130 | self.navBarStatus = IPNavBarSqueezingStatusNormal; 131 | 132 | [self.transitionCoordinator animateAlongsideTransition: 133 | ^(id context) { 134 | if ([context presentationStyle] != UIModalPresentationNone) { 135 | return; 136 | } 137 | self.titleViewPlaceholder.alpha = 0.f; 138 | self.titleViewPlaceholder.frame = CGRectOffset(self.titleViewPlaceholder.frame, 200.f, 0.f); 139 | [self.navigationController setToolbarHidden:YES 140 | animated:YES]; 141 | } completion:nil]; 142 | 143 | [self.transitionCoordinator notifyWhenInteractionEndsUsingBlock: 144 | ^(id context) { 145 | if (![context isCancelled]) { 146 | return; 147 | } 148 | double delayInSeconds = 0.5; 149 | dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 150 | (int64_t)(delayInSeconds * NSEC_PER_SEC)); 151 | dispatch_after(popTime, dispatch_get_main_queue(), ^(void) { 152 | if (self.navigationController.toolbarHidden) { 153 | self.navigationController.toolbarHidden = NO; 154 | } 155 | }); 156 | }]; 157 | } 158 | 159 | - (void)viewDidDisappear:(BOOL)animated 160 | { 161 | [super viewDidDisappear:animated]; 162 | [self.titleViewPlaceholder removeFromSuperview]; 163 | } 164 | 165 | - (void)setTriggeringScrollView:(UIScrollView *)triggeringScrollView 166 | { 167 | if (self.triggeringScrollView == triggeringScrollView) { 168 | return; 169 | } 170 | self->_triggeringScrollView = triggeringScrollView; 171 | self->_triggeringScrollView.delegate = self; 172 | 173 | // Recognize tap on content 174 | // TODO: move to property and remove gestures on dealloc 175 | UITapGestureRecognizer *tapContentRecognizer = [[UITapGestureRecognizer 176 | alloc] initWithTarget:self 177 | action:@selector(navBarTapped:)]; 178 | tapContentRecognizer.numberOfTapsRequired = 1; 179 | [self.triggeringScrollView addGestureRecognizer:tapContentRecognizer]; 180 | } 181 | 182 | 183 | #pragma mark - Setter methods 184 | 185 | - (void)setTitleFont:(UIFont *)titleFont 186 | { 187 | if ([self.titleFont.familyName isEqualToString:titleFont.familyName]) { 188 | return; 189 | } 190 | self->_titleFont = titleFont; 191 | self.titleViewPlaceholder.font = self.titleFont; 192 | } 193 | 194 | - (void)setTitleColor:(UIColor *)titleColor 195 | { 196 | if (CGColorEqualToColor(self.titleColor.CGColor, titleColor.CGColor)) { 197 | return; 198 | } 199 | self->_titleColor = titleColor; 200 | self.titleViewPlaceholder.textColor = self.titleColor; 201 | } 202 | 203 | 204 | #pragma mark - Scroll View Delegate 205 | 206 | - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 207 | { 208 | #ifdef DEBUG_SQUEEZE 209 | NSLog(@"Begin Dragging"); 210 | #endif 211 | if (self.navBarStatus == IPNavBarSqueezingStatusNormal) { 212 | self.dragStart = YES; 213 | } 214 | self.previousYOffset = scrollView.contentOffset.y; 215 | } 216 | 217 | - (void)scrollViewDidScroll:(UIScrollView *)scrollView 218 | { 219 | if (self.dragStart == NO) { 220 | return; 221 | } 222 | CGFloat delta = scrollView.contentOffset.y - self.previousYOffset; 223 | 224 | #ifdef DEBUG_SQUEEZE 225 | NSLog(@"scroll to offset: %f", scrollView.contentOffset.y); 226 | NSLog(@"offset delta: %f", delta); 227 | #endif 228 | switch (self.navBarStatus) { 229 | case IPNavBarSqueezingStatusNormal: { 230 | // Squeeze when scroll up higher than a threshold 231 | CGFloat threshold = 30.f; 232 | 233 | if (delta < threshold) { 234 | return; 235 | } 236 | if (delta > 200.f) { 237 | [self squeezeBars]; 238 | } else { 239 | [self processBars]; 240 | [self squeezeNavBarWithProgress:delta / 200.f]; 241 | } 242 | } 243 | break; 244 | case IPNavBarSqueezingStatusProgress: { 245 | [self squeezeNavBarWithProgress:delta / 200.f]; 246 | } 247 | break; 248 | default: break; 249 | } 250 | } 251 | 252 | - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView 253 | withVelocity:(CGPoint)velocity 254 | targetContentOffset:(inout CGPoint *)targetContentOffset 255 | { 256 | #ifdef DEBUG_SQUEEZE 257 | NSLog(@"End Dragging: (%f,%f) %f", velocity.x, velocity.y, targetContentOffset->y); 258 | #endif 259 | self.dragStart = NO; 260 | CGFloat offsetDelta = targetContentOffset->y - self.previousYOffset; 261 | 262 | // Finish squeezing when squeezing is not finished 263 | if (self.navBarStatus == IPNavBarSqueezingStatusProgress) { 264 | [self squeezeBars]; 265 | } 266 | /** 267 | Un-squeeze only when 268 | o scroll up 269 | o fast enough 270 | o is squeezed 271 | Or 272 | o is squeezed 273 | o the target is top edge 274 | */ 275 | if (self.navBarStatus == IPNavBarSqueezingStatusSqueezed) { 276 | if (offsetDelta < 0 || 277 | fabs((targetContentOffset->y) + 40) < FLT_EPSILON) { 278 | [self expandBars]; 279 | } 280 | } 281 | 282 | } 283 | 284 | - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView 285 | { 286 | if (self.navBarStatus != IPNavBarSqueezingStatusSqueezed) { 287 | return YES; 288 | } 289 | [self expandBars]; 290 | return NO; 291 | } 292 | 293 | 294 | #pragma mark - Bars squeezing 295 | 296 | - (void)processBars 297 | { 298 | // for inheritance 299 | } 300 | 301 | - (void)squeezeNavBarWithProgress:(CGFloat)delta 302 | { 303 | #ifdef DEBUG_SQUEEZE 304 | NSLog(@"Progress: %f", delta); 305 | #endif 306 | CGFloat progress = MIN(delta, 1.f); 307 | 308 | self.navBarStatus = IPNavBarSqueezingStatusProgress; 309 | 310 | [self hideBarItemsAnimated:YES]; 311 | 312 | self.navigationController.navigationBar.frame = CGRectMake(0.f, 313 | kStatusBarHeight, 314 | SCREEN_WIDTH, 315 | NAVBAR_HEIGHT 316 | - (NAVBAR_HEIGHT - kSqueezedNavigationBarHeight) 317 | * progress); 318 | if (progress < delta) { 319 | [self squeezeBars]; 320 | } 321 | } 322 | 323 | - (void)hideBarItemsAnimated:(BOOL)animated 324 | { 325 | if (self.navigationItem.leftBarButtonItems.count != 0) { 326 | self.leftBarButtonItems = [self.navigationItem.leftBarButtonItems copy]; 327 | [self.navigationItem setLeftBarButtonItems:nil 328 | animated:animated]; 329 | } 330 | if (self.navigationItem.rightBarButtonItems.count != 0) { 331 | self.rightBarButtonItems = [self.navigationItem.rightBarButtonItems copy]; 332 | [self.navigationItem setRightBarButtonItems:nil 333 | animated:animated]; 334 | } 335 | if (!self.navigationItem.hidesBackButton) { 336 | [self.navigationItem setHidesBackButton:YES 337 | animated:animated]; 338 | } 339 | if (!self.navigationController.toolbarHidden) { 340 | [self.navigationController setToolbarHidden:YES 341 | animated:animated]; 342 | } 343 | } 344 | 345 | - (void)showBarItemsAnimated:(BOOL)animated 346 | { 347 | [self.navigationItem setLeftBarButtonItems:self.leftBarButtonItems 348 | animated:animated]; 349 | [self.navigationItem setRightBarButtonItems:self.rightBarButtonItems 350 | animated:animated]; 351 | [self.navigationItem setHidesBackButton:NO 352 | animated:animated]; 353 | [self.navigationController setToolbarHidden:NO 354 | animated:animated]; 355 | } 356 | 357 | - (void)squeezeBars 358 | { 359 | #ifdef DEBUG_SQUEEZE 360 | NSLog(@"Start squeezing"); 361 | #endif 362 | self.navBarStatus = IPNavBarSqueezingStatusSqueezing; 363 | self.titleViewPlaceholder.text = self.title; 364 | 365 | UIView* titleViewContainer = [[UIView alloc] initWithFrame:CGRectMake(0.f, 0.f, 366 | SCREEN_WIDTH, 367 | kStatusBarHeight)]; 368 | self.titleViewPlaceholder.translatesAutoresizingMaskIntoConstraints = NO; 369 | [titleViewContainer addSubview:self.titleViewPlaceholder]; 370 | 371 | NSLayoutConstraint *centerXConstraint = [NSLayoutConstraint constraintWithItem:self.titleViewPlaceholder 372 | attribute:NSLayoutAttributeCenterX 373 | relatedBy:NSLayoutRelationEqual 374 | toItem:titleViewContainer 375 | attribute:NSLayoutAttributeCenterX 376 | multiplier:1.0 377 | constant:0.0]; 378 | NSLayoutConstraint* topMarginConstraint = [NSLayoutConstraint constraintWithItem:self.titleViewPlaceholder 379 | attribute:NSLayoutAttributeTop 380 | relatedBy:NSLayoutRelationEqual 381 | toItem:titleViewContainer 382 | attribute:NSLayoutAttributeTop 383 | multiplier:1 384 | constant:4]; 385 | NSLayoutConstraint* heightConstraint = [NSLayoutConstraint constraintWithItem:self.titleViewPlaceholder attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:kStatusBarHeight]; 386 | 387 | self.navigationItem.titleView = titleViewContainer; 388 | [titleViewContainer addConstraint:centerXConstraint]; 389 | [titleViewContainer addConstraint:topMarginConstraint]; 390 | [self.titleViewPlaceholder addConstraint:heightConstraint]; 391 | 392 | [self hideBarItemsAnimated:YES]; 393 | 394 | [UIView animateWithDuration:kAnimationDuration 395 | delay:0.0 396 | options:UIViewAnimationOptionCurveEaseInOut 397 | animations:^{ 398 | CGRect frame = CGRectMake(0.f, 399 | kStatusBarHeight, 400 | SCREEN_WIDTH, 401 | kSqueezedNavigationBarHeight); 402 | self.titleViewPlaceholder.transform = 403 | CGAffineTransformScale(self.titleViewPlaceholder.transform, 0.75f, 0.75f); 404 | 405 | self.navigationController.navigationBar.frame = frame; 406 | } 407 | completion:^(BOOL finished) { 408 | [self.navigationController.navigationBar addGestureRecognizer:self.recognizer]; 409 | self.navigationController.navigationBar.userInteractionEnabled = YES; 410 | self.titleViewPlaceholder.userInteractionEnabled = YES; 411 | self.triggeringScrollView.contentInset = UIEdgeInsetsMake(kStatusBarHeight 412 | + kSqueezedNavigationBarHeight, 413 | 0.f, 0.f, 0.f); 414 | self.triggeringScrollView.scrollIndicatorInsets = 415 | UIEdgeInsetsMake(kStatusBarHeight 416 | + kSqueezedNavigationBarHeight, 417 | 0.f, 0.f, 0.f); 418 | self.titleViewPlaceholder.text = [self squeezedTitle: 419 | self.titleViewPlaceholder.text]; 420 | if (self.squeezeCompletion) { 421 | self.squeezeCompletion(); 422 | } 423 | #ifdef DEBUG_SQUEEZE 424 | NSLog(@"End squeezing"); 425 | #endif 426 | self.navBarStatus = IPNavBarSqueezingStatusSqueezed; 427 | }]; 428 | } 429 | 430 | - (NSString *)squeezedTitle:(NSString *)title 431 | { 432 | return [NSString stringWithFormat:@"[ %@ ]", title]; 433 | } 434 | 435 | - (void)expandBars 436 | { 437 | #ifdef DEBUG_SQUEEZE 438 | NSLog(@"Start expanding"); 439 | #endif 440 | self.navBarStatus = IPNavBarSqueezingStatusUnSqueezing; 441 | [self.navigationController.navigationBar removeGestureRecognizer:self.recognizer]; 442 | self.titleViewPlaceholder.text = self.title; 443 | 444 | [UIView animateWithDuration:kAnimationDuration 445 | delay:0.0 446 | options:UIViewAnimationOptionCurveEaseInOut 447 | animations:^{ 448 | self.navigationController.navigationBar.frame = CGRectMake(0.f, 449 | kStatusBarHeight, 450 | SCREEN_WIDTH, 451 | NAVBAR_HEIGHT); 452 | // title 453 | self.titleViewPlaceholder.transform = CGAffineTransformIdentity; 454 | 455 | self.triggeringScrollView.contentInset = 456 | UIEdgeInsetsMake(NAVBAR_HEIGHT 457 | + kStatusBarHeight, 458 | 0.f, 459 | TOOLBAR_HEIGHT, 460 | 0.f); 461 | self.triggeringScrollView.scrollIndicatorInsets = 462 | UIEdgeInsetsMake(NAVBAR_HEIGHT 463 | + kStatusBarHeight, 464 | 0.f, 0.f, 0.f); 465 | self.navigationController.toolbarHidden = NO; 466 | } 467 | completion:^(BOOL finished) { 468 | self.navigationItem.titleView = self.titleViewOriginal; 469 | 470 | [self showBarItemsAnimated:YES]; 471 | 472 | if (self.expandCompletion) { 473 | self.expandCompletion(); 474 | } 475 | #ifdef DEBUG_SQUEEZE 476 | NSLog(@"End expanding"); 477 | #endif 478 | self.navBarStatus = IPNavBarSqueezingStatusNormal; 479 | }]; 480 | } 481 | 482 | - (void)navBarTapped:(id)sender 483 | { 484 | if (self.navBarStatus == IPNavBarSqueezingStatusSqueezed) { 485 | [self expandBars]; 486 | } 487 | } 488 | 489 | - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation 490 | duration:(NSTimeInterval)duration 491 | { 492 | [self expandBars]; 493 | } 494 | 495 | @end 496 | -------------------------------------------------------------------------------- /Examples/Sample/Sample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 4F5F8A0D1A224CC400C95C4C /* Launch Screen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 4F5F8A0C1A224CC400C95C4C /* Launch Screen.xib */; }; 11 | 4F6A37671A20E09100323282 /* NSHipster.com.html in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A375A1A20E09100323282 /* NSHipster.com.html */; }; 12 | 4F6A37681A20E09100323282 /* analytics.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A375C1A20E09100323282 /* analytics.js */; }; 13 | 4F6A37691A20E09100323282 /* application.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A375D1A20E09100323282 /* application.js */; }; 14 | 4F6A376A1A20E09100323282 /* book-cover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A375E1A20E09100323282 /* book-cover@2x.png */; }; 15 | 4F6A376B1A20E09100323282 /* cc.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A375F1A20E09100323282 /* cc.js */; }; 16 | 4F6A376C1A20E09100323282 /* cfhipsterref-cover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37601A20E09100323282 /* cfhipsterref-cover@2x.png */; }; 17 | 4F6A376D1A20E09100323282 /* embed.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37611A20E09100323282 /* embed.js */; }; 18 | 4F6A376E1A20E09100323282 /* jquery.min.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37621A20E09100323282 /* jquery.min.js */; }; 19 | 4F6A376F1A20E09100323282 /* screen.css in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37631A20E09100323282 /* screen.css */; }; 20 | 4F6A37701A20E09100323282 /* swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37641A20E09100323282 /* swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js */; }; 21 | 4F6A37711A20E09100323282 /* swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37651A20E09100323282 /* swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css */; }; 22 | 4F6A37721A20E09100323282 /* the-nshipster-fake-book-cover@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4F6A37661A20E09100323282 /* the-nshipster-fake-book-cover@2x.png */; }; 23 | 4FB8460318E50C450056BDFB /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FB8460218E50C450056BDFB /* Foundation.framework */; }; 24 | 4FB8460518E50C450056BDFB /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FB8460418E50C450056BDFB /* CoreGraphics.framework */; }; 25 | 4FB8460718E50C450056BDFB /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 4FB8460618E50C450056BDFB /* UIKit.framework */; }; 26 | 4FB8460D18E50C450056BDFB /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 4FB8460B18E50C450056BDFB /* InfoPlist.strings */; }; 27 | 4FB8460F18E50C450056BDFB /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FB8460E18E50C450056BDFB /* main.m */; }; 28 | 4FB8461318E50C450056BDFB /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 4FB8461218E50C450056BDFB /* AppDelegate.m */; }; 29 | 4FC763F118E725C60009F375 /* Default-568h@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FC763EE18E725C60009F375 /* Default-568h@2x.png */; }; 30 | 4FC763F218E725C60009F375 /* Default.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FC763EF18E725C60009F375 /* Default.png */; }; 31 | 4FC763F318E725C60009F375 /* Default@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 4FC763F018E725C60009F375 /* Default@2x.png */; }; 32 | AA22BA647F7D4AA39B479ABC /* libPods.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 9934BD31402B4CBE9A91C229 /* libPods.a */; }; 33 | /* End PBXBuildFile section */ 34 | 35 | /* Begin PBXFileReference section */ 36 | 4F3041DB1A1EFA8900F702A5 /* CruiserWebViewController.podspec */ = {isa = PBXFileReference; lastKnownFileType = text; name = CruiserWebViewController.podspec; path = ../../CruiserWebViewController.podspec; sourceTree = ""; }; 37 | 4F5F8A0C1A224CC400C95C4C /* Launch Screen.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "Launch Screen.xib"; sourceTree = ""; }; 38 | 4F6A375A1A20E09100323282 /* NSHipster.com.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = NSHipster.com.html; sourceTree = ""; }; 39 | 4F6A375C1A20E09100323282 /* analytics.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = analytics.js; sourceTree = ""; }; 40 | 4F6A375D1A20E09100323282 /* application.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = application.js; sourceTree = ""; }; 41 | 4F6A375E1A20E09100323282 /* book-cover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "book-cover@2x.png"; sourceTree = ""; }; 42 | 4F6A375F1A20E09100323282 /* cc.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = cc.js; sourceTree = ""; }; 43 | 4F6A37601A20E09100323282 /* cfhipsterref-cover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "cfhipsterref-cover@2x.png"; sourceTree = ""; }; 44 | 4F6A37611A20E09100323282 /* embed.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = embed.js; sourceTree = ""; }; 45 | 4F6A37621A20E09100323282 /* jquery.min.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = jquery.min.js; sourceTree = ""; }; 46 | 4F6A37631A20E09100323282 /* screen.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = screen.css; sourceTree = ""; }; 47 | 4F6A37641A20E09100323282 /* swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js"; sourceTree = ""; }; 48 | 4F6A37651A20E09100323282 /* swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = "swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css"; sourceTree = ""; }; 49 | 4F6A37661A20E09100323282 /* the-nshipster-fake-book-cover@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "the-nshipster-fake-book-cover@2x.png"; sourceTree = ""; }; 50 | 4FB845FF18E50C450056BDFB /* Sample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 51 | 4FB8460218E50C450056BDFB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 52 | 4FB8460418E50C450056BDFB /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 53 | 4FB8460618E50C450056BDFB /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 54 | 4FB8460A18E50C450056BDFB /* Sample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Sample-Info.plist"; sourceTree = ""; }; 55 | 4FB8460C18E50C450056BDFB /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 56 | 4FB8460E18E50C450056BDFB /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | 4FB8461018E50C450056BDFB /* Sample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Sample-Prefix.pch"; sourceTree = ""; }; 58 | 4FB8461118E50C450056BDFB /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 59 | 4FB8461218E50C450056BDFB /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 60 | 4FB8461B18E50C450056BDFB /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 61 | 4FC763EE18E725C60009F375 /* Default-568h@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default-568h@2x.png"; sourceTree = ""; }; 62 | 4FC763EF18E725C60009F375 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Default.png; sourceTree = ""; }; 63 | 4FC763F018E725C60009F375 /* Default@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Default@2x.png"; sourceTree = ""; }; 64 | 84072172328E77E3D64B7C81 /* Pods.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.release.xcconfig; path = "Pods/Target Support Files/Pods/Pods.release.xcconfig"; sourceTree = ""; }; 65 | 9934BD31402B4CBE9A91C229 /* libPods.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPods.a; sourceTree = BUILT_PRODUCTS_DIR; }; 66 | ED4997A7C5F4D6AACC9BD7B0 /* Pods.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = Pods.debug.xcconfig; path = "Pods/Target Support Files/Pods/Pods.debug.xcconfig"; sourceTree = ""; }; 67 | /* End PBXFileReference section */ 68 | 69 | /* Begin PBXFrameworksBuildPhase section */ 70 | 4FB845FC18E50C450056BDFB /* Frameworks */ = { 71 | isa = PBXFrameworksBuildPhase; 72 | buildActionMask = 2147483647; 73 | files = ( 74 | 4FB8460518E50C450056BDFB /* CoreGraphics.framework in Frameworks */, 75 | 4FB8460718E50C450056BDFB /* UIKit.framework in Frameworks */, 76 | 4FB8460318E50C450056BDFB /* Foundation.framework in Frameworks */, 77 | AA22BA647F7D4AA39B479ABC /* libPods.a in Frameworks */, 78 | ); 79 | runOnlyForDeploymentPostprocessing = 0; 80 | }; 81 | /* End PBXFrameworksBuildPhase section */ 82 | 83 | /* Begin PBXGroup section */ 84 | 2CD7BE64F3B51825C90A986D /* Pods */ = { 85 | isa = PBXGroup; 86 | children = ( 87 | 4F3041DB1A1EFA8900F702A5 /* CruiserWebViewController.podspec */, 88 | ED4997A7C5F4D6AACC9BD7B0 /* Pods.debug.xcconfig */, 89 | 84072172328E77E3D64B7C81 /* Pods.release.xcconfig */, 90 | ); 91 | name = Pods; 92 | sourceTree = ""; 93 | }; 94 | 4F6A37581A20E09100323282 /* html-fixture */ = { 95 | isa = PBXGroup; 96 | children = ( 97 | 4F6A37591A20E09100323282 /* NSHipster.com */, 98 | ); 99 | path = "html-fixture"; 100 | sourceTree = ""; 101 | }; 102 | 4F6A37591A20E09100323282 /* NSHipster.com */ = { 103 | isa = PBXGroup; 104 | children = ( 105 | 4F6A375A1A20E09100323282 /* NSHipster.com.html */, 106 | 4F6A375B1A20E09100323282 /* NSHipster.com_files */, 107 | ); 108 | path = NSHipster.com; 109 | sourceTree = ""; 110 | }; 111 | 4F6A375B1A20E09100323282 /* NSHipster.com_files */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | 4F6A375C1A20E09100323282 /* analytics.js */, 115 | 4F6A375D1A20E09100323282 /* application.js */, 116 | 4F6A375E1A20E09100323282 /* book-cover@2x.png */, 117 | 4F6A375F1A20E09100323282 /* cc.js */, 118 | 4F6A37601A20E09100323282 /* cfhipsterref-cover@2x.png */, 119 | 4F6A37611A20E09100323282 /* embed.js */, 120 | 4F6A37621A20E09100323282 /* jquery.min.js */, 121 | 4F6A37631A20E09100323282 /* screen.css */, 122 | 4F6A37641A20E09100323282 /* swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js */, 123 | 4F6A37651A20E09100323282 /* swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css */, 124 | 4F6A37661A20E09100323282 /* the-nshipster-fake-book-cover@2x.png */, 125 | ); 126 | path = NSHipster.com_files; 127 | sourceTree = ""; 128 | }; 129 | 4FB845F618E50C450056BDFB = { 130 | isa = PBXGroup; 131 | children = ( 132 | 4FB8460818E50C450056BDFB /* Sample */, 133 | 4FB8460118E50C450056BDFB /* Frameworks */, 134 | 4FB8460018E50C450056BDFB /* Products */, 135 | 2CD7BE64F3B51825C90A986D /* Pods */, 136 | ); 137 | sourceTree = ""; 138 | }; 139 | 4FB8460018E50C450056BDFB /* Products */ = { 140 | isa = PBXGroup; 141 | children = ( 142 | 4FB845FF18E50C450056BDFB /* Sample.app */, 143 | ); 144 | name = Products; 145 | sourceTree = ""; 146 | }; 147 | 4FB8460118E50C450056BDFB /* Frameworks */ = { 148 | isa = PBXGroup; 149 | children = ( 150 | 4FB8460218E50C450056BDFB /* Foundation.framework */, 151 | 4FB8460418E50C450056BDFB /* CoreGraphics.framework */, 152 | 4FB8460618E50C450056BDFB /* UIKit.framework */, 153 | 4FB8461B18E50C450056BDFB /* XCTest.framework */, 154 | 9934BD31402B4CBE9A91C229 /* libPods.a */, 155 | ); 156 | name = Frameworks; 157 | sourceTree = ""; 158 | }; 159 | 4FB8460818E50C450056BDFB /* Sample */ = { 160 | isa = PBXGroup; 161 | children = ( 162 | 4FB8461118E50C450056BDFB /* AppDelegate.h */, 163 | 4FB8461218E50C450056BDFB /* AppDelegate.m */, 164 | 4FB8460918E50C450056BDFB /* Supporting Files */, 165 | ); 166 | path = Sample; 167 | sourceTree = ""; 168 | }; 169 | 4FB8460918E50C450056BDFB /* Supporting Files */ = { 170 | isa = PBXGroup; 171 | children = ( 172 | 4F6A37581A20E09100323282 /* html-fixture */, 173 | 4FC763EE18E725C60009F375 /* Default-568h@2x.png */, 174 | 4FC763EF18E725C60009F375 /* Default.png */, 175 | 4FC763F018E725C60009F375 /* Default@2x.png */, 176 | 4F5F8A0C1A224CC400C95C4C /* Launch Screen.xib */, 177 | 4FB8460A18E50C450056BDFB /* Sample-Info.plist */, 178 | 4FB8460B18E50C450056BDFB /* InfoPlist.strings */, 179 | 4FB8460E18E50C450056BDFB /* main.m */, 180 | 4FB8461018E50C450056BDFB /* Sample-Prefix.pch */, 181 | ); 182 | name = "Supporting Files"; 183 | sourceTree = ""; 184 | }; 185 | /* End PBXGroup section */ 186 | 187 | /* Begin PBXNativeTarget section */ 188 | 4FB845FE18E50C450056BDFB /* Sample */ = { 189 | isa = PBXNativeTarget; 190 | buildConfigurationList = 4FB8462B18E50C450056BDFB /* Build configuration list for PBXNativeTarget "Sample" */; 191 | buildPhases = ( 192 | 1EC6BC6C7A664F638AC7E348 /* Check Pods Manifest.lock */, 193 | 4FB845FB18E50C450056BDFB /* Sources */, 194 | 4FB845FC18E50C450056BDFB /* Frameworks */, 195 | 4FB845FD18E50C450056BDFB /* Resources */, 196 | A50537A689D94FC3A207D8C1 /* Copy Pods Resources */, 197 | ); 198 | buildRules = ( 199 | ); 200 | dependencies = ( 201 | ); 202 | name = Sample; 203 | productName = Sample; 204 | productReference = 4FB845FF18E50C450056BDFB /* Sample.app */; 205 | productType = "com.apple.product-type.application"; 206 | }; 207 | /* End PBXNativeTarget section */ 208 | 209 | /* Begin PBXProject section */ 210 | 4FB845F718E50C450056BDFB /* Project object */ = { 211 | isa = PBXProject; 212 | attributes = { 213 | LastUpgradeCheck = 0510; 214 | ORGANIZATIONNAME = "DZN Labs"; 215 | }; 216 | buildConfigurationList = 4FB845FA18E50C450056BDFB /* Build configuration list for PBXProject "Sample" */; 217 | compatibilityVersion = "Xcode 3.2"; 218 | developmentRegion = English; 219 | hasScannedForEncodings = 0; 220 | knownRegions = ( 221 | en, 222 | de, 223 | ); 224 | mainGroup = 4FB845F618E50C450056BDFB; 225 | productRefGroup = 4FB8460018E50C450056BDFB /* Products */; 226 | projectDirPath = ""; 227 | projectRoot = ""; 228 | targets = ( 229 | 4FB845FE18E50C450056BDFB /* Sample */, 230 | ); 231 | }; 232 | /* End PBXProject section */ 233 | 234 | /* Begin PBXResourcesBuildPhase section */ 235 | 4FB845FD18E50C450056BDFB /* Resources */ = { 236 | isa = PBXResourcesBuildPhase; 237 | buildActionMask = 2147483647; 238 | files = ( 239 | 4F6A376F1A20E09100323282 /* screen.css in Resources */, 240 | 4F6A37691A20E09100323282 /* application.js in Resources */, 241 | 4F6A37701A20E09100323282 /* swiftype_nocode-07cbc4b36e68587ab665b0b38990d144.js in Resources */, 242 | 4F6A37671A20E09100323282 /* NSHipster.com.html in Resources */, 243 | 4FB8460D18E50C450056BDFB /* InfoPlist.strings in Resources */, 244 | 4FC763F318E725C60009F375 /* Default@2x.png in Resources */, 245 | 4FC763F118E725C60009F375 /* Default-568h@2x.png in Resources */, 246 | 4F6A37721A20E09100323282 /* the-nshipster-fake-book-cover@2x.png in Resources */, 247 | 4F6A37711A20E09100323282 /* swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css in Resources */, 248 | 4F5F8A0D1A224CC400C95C4C /* Launch Screen.xib in Resources */, 249 | 4F6A376C1A20E09100323282 /* cfhipsterref-cover@2x.png in Resources */, 250 | 4F6A376A1A20E09100323282 /* book-cover@2x.png in Resources */, 251 | 4F6A376B1A20E09100323282 /* cc.js in Resources */, 252 | 4FC763F218E725C60009F375 /* Default.png in Resources */, 253 | 4F6A37681A20E09100323282 /* analytics.js in Resources */, 254 | 4F6A376E1A20E09100323282 /* jquery.min.js in Resources */, 255 | 4F6A376D1A20E09100323282 /* embed.js in Resources */, 256 | ); 257 | runOnlyForDeploymentPostprocessing = 0; 258 | }; 259 | /* End PBXResourcesBuildPhase section */ 260 | 261 | /* Begin PBXShellScriptBuildPhase section */ 262 | 1EC6BC6C7A664F638AC7E348 /* Check Pods Manifest.lock */ = { 263 | isa = PBXShellScriptBuildPhase; 264 | buildActionMask = 2147483647; 265 | files = ( 266 | ); 267 | inputPaths = ( 268 | ); 269 | name = "Check Pods Manifest.lock"; 270 | outputPaths = ( 271 | ); 272 | runOnlyForDeploymentPostprocessing = 0; 273 | shellPath = /bin/sh; 274 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 275 | showEnvVarsInLog = 0; 276 | }; 277 | A50537A689D94FC3A207D8C1 /* Copy Pods Resources */ = { 278 | isa = PBXShellScriptBuildPhase; 279 | buildActionMask = 2147483647; 280 | files = ( 281 | ); 282 | inputPaths = ( 283 | ); 284 | name = "Copy Pods Resources"; 285 | outputPaths = ( 286 | ); 287 | runOnlyForDeploymentPostprocessing = 0; 288 | shellPath = /bin/sh; 289 | shellScript = "\"${SRCROOT}/Pods/Target Support Files/Pods/Pods-resources.sh\"\n"; 290 | showEnvVarsInLog = 0; 291 | }; 292 | /* End PBXShellScriptBuildPhase section */ 293 | 294 | /* Begin PBXSourcesBuildPhase section */ 295 | 4FB845FB18E50C450056BDFB /* Sources */ = { 296 | isa = PBXSourcesBuildPhase; 297 | buildActionMask = 2147483647; 298 | files = ( 299 | 4FB8461318E50C450056BDFB /* AppDelegate.m in Sources */, 300 | 4FB8460F18E50C450056BDFB /* main.m in Sources */, 301 | ); 302 | runOnlyForDeploymentPostprocessing = 0; 303 | }; 304 | /* End PBXSourcesBuildPhase section */ 305 | 306 | /* Begin PBXVariantGroup section */ 307 | 4FB8460B18E50C450056BDFB /* InfoPlist.strings */ = { 308 | isa = PBXVariantGroup; 309 | children = ( 310 | 4FB8460C18E50C450056BDFB /* en */, 311 | ); 312 | name = InfoPlist.strings; 313 | sourceTree = ""; 314 | }; 315 | /* End PBXVariantGroup section */ 316 | 317 | /* Begin XCBuildConfiguration section */ 318 | 4FB8462918E50C450056BDFB /* Debug */ = { 319 | isa = XCBuildConfiguration; 320 | buildSettings = { 321 | ALWAYS_SEARCH_USER_PATHS = NO; 322 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 323 | CLANG_CXX_LIBRARY = "libc++"; 324 | CLANG_ENABLE_MODULES = YES; 325 | CLANG_ENABLE_OBJC_ARC = YES; 326 | CLANG_WARN_BOOL_CONVERSION = YES; 327 | CLANG_WARN_CONSTANT_CONVERSION = YES; 328 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 329 | CLANG_WARN_EMPTY_BODY = YES; 330 | CLANG_WARN_ENUM_CONVERSION = YES; 331 | CLANG_WARN_INT_CONVERSION = YES; 332 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 333 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 334 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 335 | COPY_PHASE_STRIP = NO; 336 | GCC_C_LANGUAGE_STANDARD = gnu99; 337 | GCC_DYNAMIC_NO_PIC = NO; 338 | GCC_OPTIMIZATION_LEVEL = 0; 339 | GCC_PREPROCESSOR_DEFINITIONS = ( 340 | "DEBUG=1", 341 | "$(inherited)", 342 | ); 343 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 344 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 345 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 346 | GCC_WARN_UNDECLARED_SELECTOR = YES; 347 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 348 | GCC_WARN_UNUSED_FUNCTION = YES; 349 | GCC_WARN_UNUSED_VARIABLE = YES; 350 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 351 | ONLY_ACTIVE_ARCH = YES; 352 | SDKROOT = iphoneos; 353 | }; 354 | name = Debug; 355 | }; 356 | 4FB8462A18E50C450056BDFB /* Release */ = { 357 | isa = XCBuildConfiguration; 358 | buildSettings = { 359 | ALWAYS_SEARCH_USER_PATHS = NO; 360 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 361 | CLANG_CXX_LIBRARY = "libc++"; 362 | CLANG_ENABLE_MODULES = YES; 363 | CLANG_ENABLE_OBJC_ARC = YES; 364 | CLANG_WARN_BOOL_CONVERSION = YES; 365 | CLANG_WARN_CONSTANT_CONVERSION = YES; 366 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 367 | CLANG_WARN_EMPTY_BODY = YES; 368 | CLANG_WARN_ENUM_CONVERSION = YES; 369 | CLANG_WARN_INT_CONVERSION = YES; 370 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 371 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 372 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 373 | COPY_PHASE_STRIP = YES; 374 | ENABLE_NS_ASSERTIONS = NO; 375 | GCC_C_LANGUAGE_STANDARD = gnu99; 376 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 377 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 378 | GCC_WARN_UNDECLARED_SELECTOR = YES; 379 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 380 | GCC_WARN_UNUSED_FUNCTION = YES; 381 | GCC_WARN_UNUSED_VARIABLE = YES; 382 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 383 | SDKROOT = iphoneos; 384 | VALIDATE_PRODUCT = YES; 385 | }; 386 | name = Release; 387 | }; 388 | 4FB8462C18E50C450056BDFB /* Debug */ = { 389 | isa = XCBuildConfiguration; 390 | baseConfigurationReference = ED4997A7C5F4D6AACC9BD7B0 /* Pods.debug.xcconfig */; 391 | buildSettings = { 392 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 393 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 394 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 395 | GCC_PREFIX_HEADER = "Sample/Sample-Prefix.pch"; 396 | INFOPLIST_FILE = "Sample/Sample-Info.plist"; 397 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 398 | PRODUCT_NAME = "$(TARGET_NAME)"; 399 | TARGETED_DEVICE_FAMILY = "1,2"; 400 | WRAPPER_EXTENSION = app; 401 | }; 402 | name = Debug; 403 | }; 404 | 4FB8462D18E50C450056BDFB /* Release */ = { 405 | isa = XCBuildConfiguration; 406 | baseConfigurationReference = 84072172328E77E3D64B7C81 /* Pods.release.xcconfig */; 407 | buildSettings = { 408 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 409 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 410 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 411 | GCC_PREFIX_HEADER = "Sample/Sample-Prefix.pch"; 412 | INFOPLIST_FILE = "Sample/Sample-Info.plist"; 413 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 414 | PRODUCT_NAME = "$(TARGET_NAME)"; 415 | TARGETED_DEVICE_FAMILY = "1,2"; 416 | WRAPPER_EXTENSION = app; 417 | }; 418 | name = Release; 419 | }; 420 | /* End XCBuildConfiguration section */ 421 | 422 | /* Begin XCConfigurationList section */ 423 | 4FB845FA18E50C450056BDFB /* Build configuration list for PBXProject "Sample" */ = { 424 | isa = XCConfigurationList; 425 | buildConfigurations = ( 426 | 4FB8462918E50C450056BDFB /* Debug */, 427 | 4FB8462A18E50C450056BDFB /* Release */, 428 | ); 429 | defaultConfigurationIsVisible = 0; 430 | defaultConfigurationName = Release; 431 | }; 432 | 4FB8462B18E50C450056BDFB /* Build configuration list for PBXNativeTarget "Sample" */ = { 433 | isa = XCConfigurationList; 434 | buildConfigurations = ( 435 | 4FB8462C18E50C450056BDFB /* Debug */, 436 | 4FB8462D18E50C450056BDFB /* Release */, 437 | ); 438 | defaultConfigurationIsVisible = 0; 439 | defaultConfigurationName = Release; 440 | }; 441 | /* End XCConfigurationList section */ 442 | }; 443 | rootObject = 4FB845F718E50C450056BDFB /* Project object */; 444 | } 445 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/analytics.js: -------------------------------------------------------------------------------- 1 | (function(){var aa=encodeURIComponent,f=window,ba=setTimeout,n=Math;function Pc(a,b){return a.href=b}function fa(a,b){return a.name=b} 2 | var Qc="replace",q="data",m="match",xc="send",ja="port",u="createElement",id="setAttribute",da="getTime",x="host",A="split",B="location",ra="hasOwnProperty",ma="hostname",ga="search",E="protocol",Ab="href",kd="action",G="apply",p="push",h="hash",s="test",ha="slice",r="cookie",t="indexOf",ia="defaultValue",v="name",y="length",z="prototype",la="clientWidth",jd="target",C="call",na="clientHeight",F="substring",oa="navigator",Ub="parentNode",H="join",I="toLowerCase";var pa=new function(){var a=[];this.set=function(b){a[b]=!0};this.M=function(){for(var b=[],c=0;c=b[y])wc(a,b,c);else if(8192>=b[y]){if(0<=O[oa].userAgent[t]("Firefox")&&![].reduce)throw new Ea(b[y]);wd(a,b,c)||xd(a,b,c)||Fa(b,c)||c()}else throw new Da(b[y]);},wc=function(a,b,c){var d= 6 | ta(a+"?"+b);d.onload=d.onerror=function(){d.onload=null;d.onerror=null;c()}},xd=function(a,b,c){var d;d=O.XDomainRequest;if(!d)return!1;d=new d;d.open("POST",a);d.onerror=function(){c()};d.onload=c;d[xc](b);return!0},wd=function(a,b,c){var d=O.XMLHttpRequest;if(!d)return!1;var e=new d;if(!("withCredentials"in e))return!1;e.open("POST",a,!0);e.withCredentials=!0;e.setRequestHeader("Content-Type","text/plain");e.onreadystatechange=function(){4==e.readyState&&(c(),e=null)};e[xc](b);return!0},Fa=function(a, 7 | b){if(!M.body)return fb(function(){Fa(a,b)}),!0;a=aa(a);try{var c=M[u]('')}catch(d){c=M[u]("iframe"),fa(c,a)}c.height="0";c.width="0";c.style.display="none";c.style.visibility="hidden";var e=M[B],e=oc()+"/analytics_iframe.html#"+aa(e[E]+"//"+e[x]+"/favicon.ico"),g=function(){c.src="";c[Ub]&&c[Ub].removeChild(c)};L(O,"beforeunload",g);var ca=!1,l=0,k=function(){if(!ca){try{if(9=100*R(a,Ka))throw"abort";}function Ma(a){if(Aa(P(a,Na)))throw"abort";}function Oa(){var a=M[B][E];if("http:"!=a&&"https:"!=a)throw"abort";} 9 | function Pa(a){try{O.XMLHttpRequest&&"withCredentials"in new O.XMLHttpRequest?J(40):O.XDomainRequest&&J(41),O[oa].sendBeacon&&J(42)}catch(b){}a.set(Ac,R(a,Ac)+1);var c=[];Qa.map(function(b,e){if(e.p){var g=a.get(b);void 0!=g&&g!=e[ia]&&("boolean"==typeof g&&(g*=1),c[p](e.p+"="+K(""+g)))}});c[p]("z="+Bd());a.set(Ra,c[H]("&"),!0)}function Sa(a){var b=P(a,gd)||oc()+"/collect";Ga(b,P(a,Ra),a.get(Ia),a.get(Vd));a.set(Ia,ua,!0)} 10 | function Hc(a){var b=O.gaData;b&&(b.expId&&a.set(Nc,b.expId),b.expVar&&a.set(Oc,b.expVar))}function cd(){if(O[oa]&&"preview"==O[oa].loadPurpose)throw"abort";}function yd(a){var b=O.gaDevIds;ka(b)&&0!=b[y]&&a.set("&did",b[H](","),!0)}function vb(a){if(!a.get(Na))throw"abort";};var hd=function(){return n.round(2147483647*n.random())},Bd=function(){try{var a=new Uint32Array(1);O.crypto.getRandomValues(a);return a[0]&2147483647}catch(b){return hd()}};function Ta(a){var b=R(a,Ua);500<=b&&J(15);var c=P(a,Va);if("transaction"!=c&&"item"!=c){var c=R(a,Wa),d=(new Date)[da](),e=R(a,Xa);0==e&&a.set(Xa,d);e=n.round(2*(d-e)/1E3);0=c)throw"abort";a.set(Wa,--c)}a.set(Ua,++b)};var Ya=function(){this.data=new N},Qa=new N,Za=[];Ya[z].get=function(a){var b=$a(a),c=this[q].get(a);b&&void 0==c&&(c=ea(b[ia])?b[ia]():b[ia]);return b&&b.n?b.n(this,a,c):c};var P=function(a,b){var c=a.get(b);return void 0==c?"":""+c},R=function(a,b){var c=a.get(b);return void 0==c||""===c?0:1*c};Ya[z].set=function(a,b,c){if(a)if("object"==typeof a)for(var d in a)a[ra](d)&&ab(this,d,a[d],c);else ab(this,a,b,c)}; 11 | var ab=function(a,b,c,d){if(void 0!=c)switch(b){case Na:wb[s](c)}var e=$a(b);e&&e.o?e.o(a,b,c,d):a[q].set(b,c,d)},bb=function(a,b,c,d,e){fa(this,a);this.p=b;this.n=d;this.o=e;this.defaultValue=c},$a=function(a){var b=Qa.get(a);if(!b)for(var c=0;c=c)&&(c={},Ec(c)||Fc(c))){var d=c[Eb];void 0==d||Infinity==d||isNaN(d)||(0c)a[b]=void 0},Fd=function(a){return function(b){"pageview"!=b.get(Va)||a.I||(a.I=!0,gc(b,function(b){a[xc]("timing",b)}))}};var hc=!1,mc=function(a){if("cookie"==P(a,ac)){var b=P(a,U),c=nd(a),d=kc(P(a,Yb)),e=lc(P(a,W)),g=1E3*R(a,Zb),ca=P(a,Na);if("auto"!=e)zc(b,c,d,e,ca,g)&&(hc=!0);else{J(32);var l;t:{c=[];e=xa()[A](".");if(4==e[y]&&(l=e[e[y]-1],parseInt(l,10)==l)){l=["none"];break t}for(l=e[y]-2;0<=l;l--)c[p](e[ha](l)[H]("."));c[p]("none");l=c}for(var k=0;k=a&&d[p]({hash:ca[0],R:e[g],O:ca})}return 0==d[y]?void 0:1==d[y]?d[0]:Zc(b,d)||Zc(c,d)||Zc(null,d)||d[0]}function Zc(a,b){var c,d;null==a?c=d=1:(c=La(a),d=La(D(a,".")?a[F](1):"."+a));for(var e=0;ed[y])){c=[];for(var e=0;e=ca[0]||0>=ca[1]?"":ca[H]("x");a.set(rb,c);a.set(tb,fc());a.set(ob,M.characterSet||M.charset);a.set(sb,b&&"function"===typeof b.javaEnabled&&b.javaEnabled()||!1);a.set(nb,(b&&(b.language||b.browserLanguage)||"")[I]());if(d&&a.get(cc)&&(b=M[B][h])){b=b[A](/[?&#]+/);d=[];for(c=0;carguments[y])){var b,c;"string"===typeof arguments[0]?(b=arguments[0],c=[][ha][C](arguments,1)):(b=arguments[0]&&arguments[0][Va],c=arguments);b&&(c=za(qc[b]||[],c),c[Va]=b,this.b.set(c,void 0,!0),this.filters.D(this.b),this.b[q].m={},J(44))}};var rc=function(a){if("prerender"==M.visibilityState)return!1;a();return!0};var td=/^(?:(\w+)\.)?(?:(\w+):)?(\w+)$/,sc=function(a){if(ea(a[0]))this.u=a[0];else{var b=td.exec(a[0]);null!=b&&4==b[y]&&(this.c=b[1]||"t0",this.e=b[2]||"",this.d=b[3],this.a=[][ha][C](a,1),this.e||(this.A="create"==this.d,this.i="require"==this.d,this.g="provide"==this.d,this.ba="remove"==this.d),this.i&&(3<=this.a[y]?(this.X=this.a[1],this.W=this.a[2]):this.a[1]&&(qa(this.a[1])?this.X=this.a[1]:this.W=this.a[1])));b=a[1];a=a[2];if(!this.d)throw"abort";if(this.i&&(!qa(b)||""==b))throw"abort";if(this.g&& 36 | (!qa(b)||""==b||!ea(a)))throw"abort";if(ud(this.c)||ud(this.e))throw"abort";if(this.g&&"t0"!=this.c)throw"abort";}};function ud(a){return 0<=a[t](".")||0<=a[t](":")};var Yd,Zd,$d;Yd=new N;$d=new N;Zd={ec:45,ecommerce:46,linkid:47}; 37 | var tc=function(a,b,c){b==$?J(35):b.get(V);var d=Yd.get(a);if(!ea(d))return!1;b.plugins_=b.plugins_||new N;if(b.plugins_.get(a))return!0;b.plugins_.set(a,new d(b,c||{}));return!0},ae=function(a){function b(a){var b=(a[ma]||"")[A](":")[0][I](),c=(a[E]||"")[I](),c=1*a[ja]||("http:"==c?80:"https:"==c?443:"");a=a.pathname||"";D(a,"/")||(a="/"+a);return[b,""+c,a]}var c=M[u]("a");Pc(c,M[B][Ab]);var d=(c[E]||"")[I](),e=b(c),g=c[ga]||"",ca=d+"//"+e[0]+(e[1]?":"+e[1]:"");D(a,"//")?a=d+a:D(a,"/")?a=ca+a:!a|| 38 | D(a,"?")?a=ca+e[2]+(a||g):0>a[A]("/")[0][t](":")&&(a=ca+e[2][F](0,e[2].lastIndexOf("/"))+"/"+a);Pc(c,a);d=b(c);return{protocol:(c[E]||"")[I](),host:d[0],port:d[1],path:d[2],G:c[ga]||"",url:a||""}};var Z={ga:function(){Z.f=[]}};Z.ga();Z.D=function(a){var b=Z.J[G](Z,arguments),b=Z.f.concat(b);for(Z.f=[];0c;c++){var d;d=(d=b[c].src)?0!=d[t]("https://www.google-analytics.com/analytics")?!1:!0:!1;if(d){J(33);break t}}"https:"!=M[B][E]&&!Ba&&Ed()&& 43 | (J(36),Ba=!0);(O.gaplugins=O.gaplugins||{}).Linker=Dc;b=Dc[z];Yd.set("linker",Dc);X("decorate",b,b.Q,20);X("autoLink",b,b.S,25);Yd.set("displayfeatures",fd);Yd.set("adfeatures",Kd);a=a&&a.q;ka(a)?Z.D[G]($,a):J(50)}};$.k=function(){for(var a=$.K(),b=0;b>21:b;return b};})(window); 44 | -------------------------------------------------------------------------------- /Examples/Sample/Sample/html-fixture/NSHipster.com/NSHipster.com_files/swiftype_nocode-c3886df84f1fbe6c1177c96bbf4a40ac.css: -------------------------------------------------------------------------------- 1 | div.st-lb_overlay{background-color:rgba(0,0,0,0.3)}.st-modal-overflow .swiftype{margin-bottom:20px}.swiftype-widget .autocomplete ul li{padding-left:31px}#st-launcher-tab{position:fixed;right:60px;bottom:-40px;height:26px;color:#eee;font-size:13px;letter-spacing:1px;font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;background:#484848 url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6%2BR8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAMtJREFUeNpi%2Bv%2F%2FPwMU2wPxLiB%2BBcQ3gHgOEIsiycMxjFH0HwKeQBWvA%2BKfUAN0sWkCCf4B4o1AzIkkaQDEH4D4PDZNLVBTsTkF5gItZHEmBgYGFSB%2BAcSvGTDBNSitiCwI0vQIiKWBWBSLJmMo%2FRRFFOqn%2F1DP86D56S0uP4FwNVTjcyCeD8RboIHzH%2BpfP2yaYPF0ABpi94B4EVQzTGMgNk3YMBvU2TCNIcRogmlcjexUFgbC4BcQR0PZIUDsRIxNMMwMDRA2gAADALT3szNjmcT8AAAAAElFTkSuQmCC) no-repeat center left;border-left:10px solid #484848;padding:2px 10px;padding-left:22px;line-height:24px;cursor:pointer;overflow:hidden}#st-launcher-tab:hover{color:#fff}div.swiftype{font-family:"Lucida Grande",sans-serif;overflow:auto;overflow-x:hidden;background:#fff url(//s.swiftypecdn.com/assets/overlay_bg-4b8fea9c8f2717d10b7da7f5ed7f7bc6.png) repeat-x;font-size:13px;line-height:16px;min-height:480px;position:relative;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.6);-moz-box-shadow:0 1px 3px rgba(0,0,0,0.6);box-shadow:0 1px 3px rgba(0,0,0,0.6);-webkit-border-radius:5px;-moz-border-radius:5px;-ms-border-radius:5px;-o-border-radius:5px;border-radius:5px}div.swiftype.with-results .st-result-wrapper{background-image:none}div.swiftype .clearfix{*zoom:1}div.swiftype .clearfix:after{content:"";display:table;clear:both}div.swiftype a.close{text-align:center;font-weight:bold;font-size:18px;font-family:Helvetica,Arial,"Lucida Grande",sans-serif;text-decoration:none;position:absolute;top:23px;right:15px;display:block;width:20px;height:20px;line-height:18px;vertical-align:middle;background-color:#666;color:#fff;opacity:0.2;-moz-opacity:0.2;-khtml-opacity:0.2;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=" 20 ")";filter:alpha(opacity=20);zoom:1;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 0 #fff,1px 1px 4px rgba(0,0,0,0.4) inset;-moz-box-shadow:0 1px 0 #fff,1px 1px 4px rgba(0,0,0,0.4) inset;box-shadow:0 1px 0 #fff,1px 1px 4px rgba(0,0,0,0.4) inset;text-shadow:0 0 2px rgba(0,0,0,0.9)}div.swiftype a.close:hover{opacity:0.3;-moz-opacity:0.3;-khtml-opacity:0.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=" 30 ")";filter:alpha(opacity=30);zoom:1}div.swiftype div.st-search-bar{height:56px;width:100%;margin:0 auto;padding-top:15px;padding-right:65px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.swiftype div.st-search-bar *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}div.swiftype div.st-search-bar .st-input-wrapper{margin-left:15px;margin-right:60px;height:34px;max-width:884px;width:100%;color:#555;background-color:#fff;padding:0;padding-right:68px;border:1px solid #ccc;overflow:hidden;-webkit-border-radius:2px;-moz-border-radius:2px;-ms-border-radius:2px;-o-border-radius:2px;border-radius:2px;-webkit-box-shadow:0 1px 0 #fff,1px 1px 2px rgba(0,0,0,0.1) inset;-moz-box-shadow:0 1px 0 #fff,1px 1px 2px rgba(0,0,0,0.1) inset;box-shadow:0 1px 0 #fff,1px 1px 2px rgba(0,0,0,0.1) inset}div.swiftype div.st-search-bar .st-input-wrapper .st-input-inner{float:left;position:relative;display:block;padding-left:36px;padding-right:135px;width:100%}div.swiftype div.st-search-bar .st-input-wrapper .st-input-inner .st-input-powered-by{float:left;position:relative;display:block;width:125px;height:34px;margin-right:-130px;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAAOCAYAAAACNhNKAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAB95JREFUeNrsmAdwFVUUhs%2Fu5pUkQIQQBRWCFAWkCIpixT4WRMUGOo69YAcrijhWLCCIggUsiN1BKYoIg4gFbBEUNIqjQUkoLwESUuC1fZ778m2yPhjHUZlxwDvzz7539%2B69597zn%2F%2BcXWvGjBmyo7dEIChtVnwnB8ybKYlg0H%2FrAMXVioMVLRQpxQbFIsVDihVmkKPYonfOXF0lZQlXAtbfNsU8GVAkQY7iYkVnRUQxTrFpe59HluwkzUqp1wwa21mKFzj4%2BpZUPwQCu4rrGiccrzhCUSKw4V9o%2FRVPKOYpLlVcrhjLve8VEyHFrooaRdX2OAt7Z3F4PBiSlON4Xe0Uk%2F7g8M11YvfuI1ZecxHXBKHsqbgmfUi2JcWxhJQpKbKsf2xO3MehLlwNEfZXVCiGKb6FlPK%2F0%2F%2FuJpMJWd96T6lu0VJ%2Fpx16mSKvQXFra8Q%2BpJ9YfQ%2BX1Lo1%2BkADOQ7xonxWTVRibr0%2Ba2uj6KBoxrjgNlTTyThnM2YOKeVGn9ybVmcyCL97kWqyuR8k%2BjPpFuCe2UcT%2BlpB1szWEpttT95NTunOIqsVT5FfzKRXIXE%2FKB5VVCpGKmYqihTXKsoVrylOZuJixSkYYnF%2FPOvsjqHlrFOmuJKcFmb8x%2BBqDtUcxmzF3G1I5VFE6xZsMhJ5q2Iyv9sbG3XS8clAsCSanSNNN1QYZ5zYcOaba8Xq1EWcocMldf8dYkW3SKox7%2Bfr4GAknowtqItJyLLyte9J1jbntR77T8aZZyp%2BVLylKFQcQ%2B7%2BQPGdYpriQcVHircV57LOEM7A7PtU%2Bu5WXKEYo7iJNHM6SjFBcZjiHsVoxUr2e6EiqnhaMRzyjOE544%2FPjR9sjB7IZOahV3H4S4oROOgMxXwccwYOtCk8bsfIWxR9iI5hOCObq1nwLkU3HHQ%2B69gQZwDjwjxjZO9mmLuv4n3yn78NhBgm93WFFE1Yf7JPNvu7thNptj4izTWKk47TGjKIxNSU3VqLM3KU1JRHpKKsTBJdu0vKtr38b6u0W99GE1KeTBlpvwbZXay4njWLKb7M3noqOnLIvRWdFAdCiFJFCFs7QpjfsNM4bSGFo1fILWffnxryQawu7PESk5AUq0hVR7K%2BcarmJ7mNsQ%2Fh01mK%2BzibUSbSVbRkOptYiiP7Kc6GTd6iZUTwSzDdbCbGIh3AKDZewsIpnBL0MXQaFfJFRHacNUagPGuZ38w9CJJMhlzPEjnpopxDGkfR1YWceIFimWKK4lizB3V6bV5FRAIaxfFQqED7mqaLtqZ5knX7vVo27SbFi3%2BR8N1jJLD0C8l9XoO5Pv8bG5KJxiTcmrXDRPQkDn%2BB4jr2XsgY80hfnCKccaGvgC6CNMbuGSip4IejFc8DQTmG0L875JnoK%2FRMYJ6ELT9B6gG%2Bc5yIihvS9s3CKQNhZR%2BkuiV55msmXc9kJt%2B8ggHGae%2Fg9CFscpFv4x%2BS195V3MF8RtqGKg4iSpP0n0MaCRD5tay7CyRYiBSGGC%2FIWDukrJBxAZwxBtKZtPKFpFwpKC3RCE6nxZy0wliWiWNxn3lc4vkF0mrIMMldtkRyX3wm3Z%2B%2BL7JRAz5R4NgS1v%2B6wce0twcRM4dIvQD7jF0nMP972HoeEmvS5RLF3j5CeLWAMDbzjSrb1%2FcmZ3waAVNHOvMIlWSuWpzbntweQk2ncjUB9qvNImvIO9cj9ysxvhuTNmOileSmBBL9BlJ3JaTYlI6i%2BnE9ef4GDDIGvMj%2FuciVMN4Y1YPxs32Fief8w5HHqO8gsslj%2FZHP7r4c%2BTLXF1x1YE5NteSvKZVkVlZj8WocW1crqaLPZHPbdhJcu1qaTHhErES8%2Fl59KzG%2BL00k9VTTfjK1zaHY%2BZyiLdGzUfEZkt6ZemUm5O5Eakz%2BxVdkb%2FGYr28x53sEqWM69VXAN6aK%2BdvyfxlB55KOjaLsY2qGLKK6iILAa0WwdToHeBwMehOH%2FwwJPod1uRjmVa0dSAOevD8CcX5RfEURM5qxFhspwOjFRGsQUuUQWRf7pN1bZz%2Bkv4D%2Fy32VbUMFbWLUdl3vuYYf%2Bj4uyTbtJN65m%2BSNfUDs6k2SCoUl47Dlo81xietOQlb6vb4zDu7ImKVcFyC%2FVTi5p2%2Be9zKiOJwR6f4vRp6zr0OyjTL%2Bii9u5t6UjOq%2FBamvPU6fjyIPotidjH3mvusMHjw4iiN%2B9C3s5fkAkr%2BESnIt90th3mykv47CrAKjV5Ffquj7RLGO3B2BCKb%2FSxhbxvhKVMLr34SEjqAY8bct2GEx10g2Jj6yfahFWU1YI7qw%2BBuxU%2Bady8phL46VSEis90ES%2FKZIgj8sl1TYr6hSqxMP1bivnFYdlTVJVws5q5M0yrtDRD9MIFRTpL2OknnF3So%2BwFTz0WUvguV9gqMpKvsV60ZQh3z29i77q%2BRV8yfeUEwA7EGfi6%2FiEOJGzn4hr3RtsMX0zbR29M%2BwiWBIOmpx1uOTeekPNBzOIlKCuHnNxdlQLilnK%2BU19cfwLK0DhkWqZU5NTHLthlflEORObUfTPSd67XQKOlOF30nfgRBoHdJd9Scpw4acO%2F7HGculiLNs%2FxexWyiIxN5YsS2HT0I50qHmbD1tdDs7XHwOD%2FHqNRWiTd1G%2Fm%2BSkd8zm%2Bs5fKf69p7RFlBknSu204u6Ic4r4CxfmvgvtCTv4T%2FzwWaF714lqWR1RpH7p%2B13AQYAa5V2OsST10YAAAAASUVORK5CYII%3D) no-repeat center center;opacity:0.6;-moz-opacity:0.6;-khtml-opacity:0.6;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=" 60 ")";filter:alpha(opacity=60);zoom:1}div.swiftype div.st-search-bar .st-input-wrapper .st-input-inner .st-input-powered-by:hover{opacity:1;-moz-opacity:1;-khtml-opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=" 100 ")";filter:alpha(opacity=100);zoom:1}div.swiftype div.st-search-bar .st-input-wrapper .st-input-inner .st-input-icon{float:left;position:relative;display:block;width:34px;height:34px;right:34px;margin-right:4px;margin-left:-100%;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6%2BR8AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAM1JREFUeNpi%2BP%2F%2FPwMIA4E9EO8C4ldAfAOI5wCxKEweGcM0FAExiPEEqngdEP%2BEGqCLoQkkCMR%2FgHgjEHMiSRgA8QcgPo9NUwvUVFEskjAXaCGLMwEFVID4BZDzmgETXIPSisiCIE2PgFiakZFRFIsmYyj9FF1CF%2BoEkOd50Pz0FqufoAqqoRqfA%2FF8IN4CDZz%2FUP%2F6YWhCiqcD0BC7B8SLoJphGgMxNGGNRAYGNqizYRpDCGpC0rga2akENWHROIEoTVCNzGBbgAYABBgAuBMPKvUg1p8AAAAASUVORK5CYII%3D) no-repeat center center}div.swiftype div.st-search-bar input[type='text']{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;text-shadow:none;text-align:left;letter-spacing:normal;border:0;padding:0;margin:0;text-indent:0;word-spacing:normal;text-transform:none;cursor:auto;float:left;position:relative;display:block;background-color:transparent;height:30px;line-height:24px;vertical-align:top;width:100%;margin-top:2px;margin-bottom:2px;padding-left:0px;outline:none;border:0;font-size:14px}div.swiftype div.st-search-bar input[type='submit']{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;-webkit-border-radius:none;-moz-border-radius:none;-ms-border-radius:none;-o-border-radius:none;border-radius:none;text-shadow:none;text-align:left;letter-spacing:normal;border:0;padding:0;margin:0;text-indent:0;word-spacing:normal;text-transform:none;cursor:auto;float:left;position:relative;display:block;width:68px;height:35px;margin:0;margin-right:-68px;border:0;border-left:1px solid #ccc;cursor:pointer;-webkit-box-shadow:0 1px 0 #fff inset;-moz-box-shadow:0 1px 0 #fff inset;box-shadow:0 1px 0 #fff inset;-webkit-border-radius:0 2px 2px 0;-moz-border-radius:0 2px 2px 0;-ms-border-radius:0 2px 2px 0;-o-border-radius:0 2px 2px 0;border-radius:0 2px 2px 0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(100%, #ececec));background-image:-webkit-linear-gradient(#fafafa, #ececec);background-image:-moz-linear-gradient(#fafafa, #ececec);background-image:-o-linear-gradient(#fafafa, #ececec);background-image:linear-gradient(#fafafa,#ececec);font-family:"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;color:#656565;text-transform:uppercase;font-size:11px;font-weight:bold;line-height:22px;padding:2px 10px;vertical-align:top}div.swiftype div.st-search-bar input[type='submit']:hover{background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e8e8e8), color-stop(100%, #ececec));background-image:-webkit-linear-gradient(#e8e8e8, #ececec);background-image:-moz-linear-gradient(#e8e8e8, #ececec);background-image:-o-linear-gradient(#e8e8e8, #ececec);background-image:linear-gradient(#e8e8e8,#ececec)}div.swiftype .st-result-wrapper{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOEAAADaCAYAAABQDiUUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAC4VJREFUeNrs3f9100gXxvHBh%2F%2FtDmIqiKkg3gowFdhUgKmAUAGhAkQFhApQKsCuAKeCVdLAru%2FJ1SK8SbBjSffOzPc5Rwc45903ysgf3fkhj57f3t6GzHPW%2BPtoe0zu%2Bd%2Bstke18%2B%2BbQEgLeZ4RtIkimz6C7dBs9Fg1%2FgQoOSjPEqyEQ4VWHxODc6gxlnpc81EjqSM83R4LQ3T7VMxLBfmNjx1JBWENb7Y9xhGdd6Ugi%2B1xxUeQxIZwqOiWTiveUypkoQddVhC6zsn2OFeAo0SvRUF1zDODCPB91oqxSBhg0N9Pxozfw%2B%2FLJgSELvDllCkYQWg95vuYKb6HMH7VmxIBYed5q%2FiWXJbfMtN2ea83KZJYPEzMyFJDEdKY7ew6dQ%2BByRsqYWuRu%2FsKgHtnrF3Uj1RFKuGxkTHOJfioisSmEs6pfq1Wxfc0BQgPyWcd%2F41o%2BtZyHu5mUOmegvDRyAfkR2DZoavMtCqe0hQgvC%2BndD97yUQhssAPwv8BLENc33KIOSNt7zlNAcKgd%2BSS8Z9JCiCCcA5AIBI7hHP9ABAgEgOEpwAEIrFDWE%2FCECASA4SnjAGjgMg6YqIIh4GnYGJJCcQ0EQpAFuLjyEivF4%2B4JYRQHh6e0YxRZRKYPHOVY77KVC%2FGpxbZF3TV%2BPc4pPnEj%2Bxg8AkC8SKU7swm4nHgRm8g9Z8Cb73Hf3eiICc7R8xVcQ2DOBHKTmDTyKpbvQ29HG1utFu%2F%2B2IW4tsXdaMQeYFNZAhlQ6aLSH6%2Ferv5Pt%2F%2F8EoxLiJpI7mW76AQD8ITHS95vttXCu8i2G4tP9Rx1zKC6iiVnG0yIkH4NfidDa0U3oWz7lUMGKVb%2BgIONjlkieKVY4D1plEfHI5vbvS8xuFuKwqPkXNjr5oIKuHP4G%2BqfhPi23HM6z6rlZ4Tb4dyWgnfOwRYf5BjG8vIksBLh1Vx5LhSZ18Jva0JVjq%2B%2BpJA%2B59pV9rTWJG1Q4eVcOkM4DQRgEGruPQwVo7O6QIWvhDWM3sestIPbGp36Ru9sVw6OZ9pYMc2Vwi9VMGVfjhSfbJDfq%2FXwc%2BD1bwZy8mY0MtYMHWAu5FdyhcOzkN6HcyUGlfCGQBN8sZJ1%2FQcHvaV0HpdMOd1K%2BmFlMF2LbHS68%2FD3UaV8CzYrwtOM%2B4O3WhPpDI8h1HgC9umCK3HJDIxkPta1bUDBEzQGCEcGl98GQ%2Fxje%2B7XBmPzaQ7zMZQBggtJ2SqwOvTdiMPf1su5nM9jBBadn%2BYCPAFgXFhRgjLkM7jaG1HxseF0c8e0yXtF%2BErw3M553L8sZdgNVtKNewRoVVjy2QM2ys8HummX4Awvewu1lst0PP1mf1i%2BSjhiPF695XwxAhgCcAoquGU5u8eoVUj8%2F21w1KAMF2EFs8pStfqG5fhoFwHmwe8eelPoggvuQTRtBuVsKM0J2b%2BMbq7Mh58Wv4O%2FU%2FQcL06rIQWi7EbLuhRKQ1%2B5phm7w6hxZQ3XdH42o9xYYcILfr7Jc0fXfuBMLFKCMLjIrOkfT%2FGNqLZu0PY9x1OxoM8fRHfjYxK2CHCYICQHJ%2B%2Bv2dIJUyoEtIV5WZGjMeEFU0fLUJ2506kO7qi6amExBYhaSfskA1CQkgbCIc0AyH5VUImZghpILRYNGe9iRDGhISAkBBiiJDuaDthU14QPjk8CBzvzWxDs3eDsO8nWMY0fbQ3Mx4Q6AhhBcIoQzuC8MmZ0vRRVkKe%2BU2oOyphUiG%2BmxkPWSRUCamGx8fiK0VUwsQqIQjja78NzZ4WQl63FV%2F7UQk7RHhjdJd7xSV4UuQNWhMQpoWQakgV3Kcryg55CSJcBL7P%2BJQsqYJpIiwz%2BkDFHJkVHRv83JKm7ya7r8u2eDOTdHNecCn2zvdgMzPKG5l6qIRWdzu5q8%2B5FHtXQQuAFQD7Q2j1pqRzLoXrdqIrmnglrKvhWy6HyypoeXPOckwo%2BWk08K%2F05zINfn9%2BBLvvYY64Lv1VQsu7nlzogktyb94bArwEYP8ILSHIIjRP0fweeTrGchmHrqhBd9SyS0q31Fc3lK6oUSWUXBhfdO6%2Bd%2FloDLAAoB1C67HZVD%2BAOWce7J8mYoxuiPDGwQVYhnwX8U8dtP9me1xBxA6hl7tgkSFEAVg6OI9zeNgjvHLyYcgJYg3QenPkinG5D4SSCyfnmQNELwDr686ETE95aImiGcvlit0stseXBK%2FDmVYeDwBZInJWCesPvpdIRfyc2DWYO6qAVEGnCL2MDZs3BflO3UnkbT%2FUG0rh6JwqR0MQEO7k3Nl5T8PddguxPuJ2pue%2FcHZeS6qgX4RXwd%2FCbf1kzdeIqqJUv4%2Fasxg7O7dVouNt99lnYqbOiV4oj%2B8WrLtRnsczcz0%2Fr%2B9mnAYW511XQsl18LuAO9Jz24S7r%2F0MneH7qT0JrwALAMZRCetYP9V%2FSGUsgs379IY63lsG%2F68vY0kiQoSeFpX3SakYu%2F5yqsCbNY5YIuf6DQpxIZS8DXFOZa8UY6l%2FPxblmfYKZiHOF9zINXzXUpdbwsROjwglX0P829hv9CgbSKsHxpyTxgTGKIIu%2BT43pGkLN6J5%2BDVzvgBivwiHeiHHNGN0qRTgukWAAYhPy%2BCI%2F%2FYm8EKXWLPsCGAIeX79zAxh0Au5oBmjGwd%2B6QggEA0Q1oNxnjeMIzIp9a5jgEA0QBj0whY0p%2Bu08azq%2FMDrDMQeEdbjDN5h5xfgNBw3E3ooQCAaILwJv77dQPyk0gpoARCIPSMEok%2BAcj3WhgCB2DNCIAIQiA4QAtHHGHDiDCAQe0ZYQ3wZmDW1ACg3wGuHAIHYM8I6bwLriH2lCHazoEB0jFAi64iLcP%2FD0aSdnOsNLwaAQGzkmAe4nxL5LqI8tTHGTGuplyCO%2FU5g3wCbkfPP9qHvQc8%2Fb60TBmyx3t74bxI5wOwr4sDgZ0p36XW4e8KG7ulx3U%2BZ%2BLqOHGD2EPvuju7mpDGZQPavfotw%2FFeRPAHMums6MP75chf%2Fi6p4cPVLFWCWFXHg5Dw%2BhbvJmgJn96bU9vnQ0v%2Ff3HlbZwVx4OhcZKz4RicaStz91%2FWcam%2FhOhOA2UEcODyntX7ophlj3OjYSLqebW7KGwvArCAOHJ%2FbVYYYS8X3IrQ%2FOREbwGwgWs%2BOHpITnZiQzaVGiV2HInS7FX2sAJtZhERnTWNCWKfe6XoZ4t77U7qc9Vb9Xe4MngLApCHGiHC3Os704kwigXepKNY9%2FLyUACYLMXaEuyCn4deW9F66rPW2%2B%2FJnny%2BnSRFgkhBTQribU62OAnIc%2BnkqZ9U4yp6q3UOJ4e1ZQEwc4UMwRw2QTZj7IC3v%2BftKu5lrZ7%2FrUM8RiCAkQATiYxnwOU06Oez1U4TI1xFBCEQggpAAMW%2BIIAQiEEFIgJg3RBACEYggJEDMGyIIgQhEEBIg5g0RhASIICRAzBsiCAkQQUiAmDdEEBIggpAAMW%2BIICRABCEBYt4QQUiAaAwRhASIxhBBSIBoDBGEBIjGEEFIgGgMEYQEiMYQQUiAaAwRhASIxhBBSIBoDBGEBIjGEEFIgGgMEYQEiMYQQUiAaAwRhASIxhBBSIBoDBGEBIjGEEFIgGgMEYQEiMYQQUiAaAwRhASIxhBBSIBoDBGEBIjGEEFIgGgMEYQEiMYQQUiAaAwRhASIxhBBSIBoDBGEBIjGEEFIgGgMEYQEiMYQn93e3nLJidcMt0e5PSYJ%2F44LEBIg2qaiO0romhoClN8NhASIhgC3xxqEBIiGAOUfICRANAQIQgJEY4AgJEA0BghCAkRjgCAkQDQGCEICRGOAICRANAYIQgJEY4AgJEA0BghCAkRjgCAkQDQGCEICRGOAICRANAYIQgJEY4AgJEA0BghCAkRjgCAkQDQGCEICRGOAICRANAYIQgLE%2FSB2BhCEBIh%2FhtgpQBAS8jjEzgGCkJCHIfYCEISE3A%2BxN4AS3kVByO%2BRd1%2BM%2BwIo%2BVeAAQC1yJUXfK99EQAAAABJRU5ErkJggg%3D%3D);background-repeat:no-repeat;background-position:center center}div.swiftype div.st-result-listing{margin:0 auto;max-width:600px;margin-left:52px;overflow-x:hidden;padding-top:20px}div.swiftype div.st-result-listing div.st-search-summary{border-bottom:1px solid #f1f1f1;margin:0 auto 10px;padding:10px 0 5px;max-width:600px}div.swiftype div.st-result-listing div.st-search-summary h2{letter-spacing:0;line-height:18px;margin:0;font-size:11px;font-weight:normal;color:#999}div.swiftype div.st-result-listing div.st-search-summary h2 strong{letter-spacing:0}div.swiftype div.st-result-listing div.st-search-summary h2 .st-query{font-style:italic;color:#666}div.swiftype div.st-result-listing div.st-search-summary h2 .st-spelling-suggestion a{font-style:italic}div.swiftype div.st-result-listing .st-results{max-width:600px;margin:0 auto;font-size:12px}div.swiftype div.st-result-listing .st-results div.st-result{border-bottom:1px solid #f1f1f1;padding-bottom:10px;margin-bottom:10px}div.swiftype div.st-result-listing .st-results div.st-result .st-result-text{max-width:600px;overflow:hidden}div.swiftype div.st-result-listing .st-results div.st-result .st-result-text h3{letter-spacing:0;line-height:18px;margin:0}div.swiftype div.st-result-listing .st-results div.st-result .st-result-text h3 a{font-size:12px;font-weight:bold;text-decoration:underline;border:none;margin:0;padding:0}div.swiftype div.st-result-listing .st-results div.st-result .st-result-text .st-metadata{text-align:left}div.swiftype div.st-result-listing .st-results div.st-result .st-result-text .st-metadata .st-snippet{font-size:11px;color:#555}div.swiftype div.st-result-listing .st-results div.st-result .st-result-image{overflow:hidden;margin-right:10px;float:left}div.swiftype div.st-result-listing .st-results div.st-result.with_image .st-result-text{margin-left:100px;max-width:450px}div.swiftype div.st-result-listing .st-pagination{padding:5px 0 25px;font-size:11px;max-width:600px;margin:5px auto 20px}div.swiftype div.st-result-listing .st-pagination a{text-decoration:none;color:#999}div.swiftype div.st-result-listing .st-pagination .st-prev{float:left}div.swiftype div.st-result-listing .st-pagination .st-next{float:right}div.swiftype div.st-result-listing .st-logo-footer{display:none}div.swiftype div.st-result-listing .st-logo-footer a{display:block;margin:0 auto 10px;width:130px;height:16px;background:transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIAAAAAPCAYAAAAs2MfGAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAABzZJREFUeNrsWQlsVUUUve%2F3d6F7lYJBCXXDoqhUQFms9BMLoqEtqESUSIkaMAawiMa9bSSxmgjFjSVGCi4Ji1IEE1PQzyZR9oBWwSDFElEw0I2uf%2FHc3%2FPI8P21lrSGpExy8ua9mf9m3txzz70z3%2Bn3%2B6W7FM%2FETLvqALKBR4BUIA5oBk4BXwPvAX%2FYnZ0OSxaeaZAlNU0Sh3onlx6cyzXASWANUPV%2FrYlTul8JB5bR%2BAY7PFgN53WoDQdygEyTBJbVaYZfAIwA3gA%2BB14AXmFbC%2FCtQYAwwNuVi%2BHohgQo%2FIfxm5vFurY%2FCAButCriQGCuvUA%2BPNvb5JGIzuGAGv92eryWu3j9GEgBfgKGAfuApZcUoHOLLvpT5z05WydW%2Bmix%2BvYT%2F%2BFykcgou%2BVuVQuHZbX82OyR8mavhHeOCkwAYoEThpdr%2BZ3QkgYMAv7qcgKotK1bt06Zl0vpKc3Ozq7AswzUM4L6b0bbZq2gvQCX%2Fbgv5X1wf31XCdqr2J7IMRI5xn7jPcHvPXfPZ7n0DrsExuXzRNSL2W8Q5bs0Kytrf4jvHQfEU9NF6uvFuj5VHNNmiG%2FeS3D38wSxT2CulpxaXdcsdT6%2Fxn8lUB5wG1BLuV4JTARUOhYBNZzDYGAJcBwYC4yml98IDNHpMhylcjxtnwV8D0w2CDsP2MN5DwA2ANvZPhXoB3wFTGK4WAE8yb4bgfnMb2LYfywdX8NPiZOGW6s3wK1APp5dTWPmqzGMRakwjJ1vE4Zt9rNC3uczuXHRMG72r%2BIY02C4EvYTY5zge%2FtDlQDLgQSN4SSUzseNegWJqPFVUC9oI7m981ytsVGsy3tKWD5C8Q%2FgSvkBseITxPhVOFwzvNrjk11NXomyLB3vC%2BAm5gZxNLImbVP4%2FBvgAPA20Bc4RKO%2FBgwFPgOeYf0knaEnxxtCNVAJSucztQOYKa%2BTLHM5znYS9F0qyXckj0rU48BlBqk0r3gLWAXcy3EjWI9x0HBqlIVYOJWnhZyYcDFdBkoMg6iBErH4OeYK6%2BIr%2BJ4Mw6g6Rhra0uhF2R1Uqwq%2BO4%2BGT6FKBAyPeTzN8fLaCQHwEzhKQiKMXyTe5F6y48hRqZw%2BR%2BqzJ7W2tZLHB5HwNaBe7fNJmBXwel38OuA%2BEiCNMXsH36%2FtI2l8IUFSaPC99GQ7jkTSuLt4v4j936QXa9kKJAEv0kltEuvYLoYSdYpjJI%2BTa30llUTLGCqUGvxnEsfOOyY76flq0KPqSfpChgBbft0mGeh5OVzoKv621JDrAlZnA8Wsa%2F9COxxQsosNw6gi5LdDgEGcSyIX1SZjHhMm9f5iO7S0UVo9w%2BsRR9b9Ism9pfrwIYlId0lkUqKEF70qFoztDwuE5UagyYK9wgC%2F%2BCv5vTp%2BGfEOJV63jk8wNAxjGDhBgz7IsTdSou04YxOh2c5GGEa0NBht9o5gJ9XlFhp1HJ%2Bvokfb793BXELV5g5%2B8wi2RVBNkjhWLwc%2FyEU2K5tm05vMrLnQkPYcwwgBMpAU7ZUEgyQpBlGExnQRbSoA52ArgJtkqjDIUNjOHOJalyFSfGtXivfhLEj%2FQbmqTx9JmD9PwlH3h4fbfTUBqzPyvl8oqZ%2FoppFxehsN7iZhVEEf4uIvpQEe4%2B%2FL2piTFWJHFirb9DBv0DKTJNjCeUWG2Nl5jK1lhEGAK6gcHwIfOOmpKZx8MT06ZGGyONWIz1uYreaaIYB9xZB5NVAuni2n8RbwdzYJjhlJYFvDVxl9KoISzmqO3d4ByrlFturPirdXb2kcOlziFxdL5L5d4o%2BJNfseRq%2BWcuwAapEAOi1JpkdOoQeVMW4PYAzebeQYa6gAuuA3AJVs%2F68lzDiziKZyNFFp9dxgFNtXhCCM%2FY1jedUQ86tBhuepEPoNSU56lB6MnDGMpbBVwB3kqbrwE4zsvx9JEWy5KhrZlukUSrXd5upgDpCBsfyGGuRdwK5H43eyffDTMGqMRLvLpMemL8UfHRPcd6suayWSQM0D4i3rHi74GRIuhQnVNsMZlAC%2FMXYLDd%2BXu4UawwtNQzkMY9vlOK%2Fp3G28T6%2Ffy9g%2BkonoBuM3XhJnPeW9N3OD%2BTT8s0wqjwCnmQvs6%2FRzzX8r3A0kmlu8riqhdgGeiZnuAIE1zsfGScOIURJdxjU8fwuoCzQYe%2BSKt6oaZFlNE9Jlqz%2BePQrczFByUCWUVzsBnEVj2545g3nBRwZR5nDrt5p5wUy%2BcwN3GcKdwXM8kKqlc33Ktpe5q9AQM91INneSTGtIjiPcotrnDalU6oEkS7mSxepm%2FwXMCWyJ8M3%2BqKiACljNUPWwsOCuKrNF%2Bh%2FAqtomKTjd0BX%2FAVxoUZKMp4JuNgiw29hO7rl0FBy6LA54GjI7S88BWlqCje%2FjwUuR%2BeAiKS4adjzPAba2YccOne52t6PgeuCBQHJqWZlACtegmlustUaecrGVWMr4euY%2FJjc1TGzi9c%2BOvPRvAQYAgFh4Ih%2BROgcAAAAASUVORK5CYII%3D) no-repeat;background-size:130px 15px;text-indent:-9999px}@media only screen and (-webkit-device-pixel-ratio: 2){div.swiftype div.st-result-listing .st-logo-footer a{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPIAAAAeCAYAAAAW7kNdAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAEP1JREFUeNrsXQl0lNUVvrOE7CEKIiiVIOoB1ygFESoET7F1Y7FV29oKuB5aUdKqPaAVqLa1iyLValsXovUUpSqhqK2KiooVlSW4sSlGFGWRMEBCJplkpvdmvkduXt4%2FmcGAiWcu557JvP%2F9%2F3v%2F%2B99373fve%2F%2Fgi8VilJaOLQ3nj0p0uDvr8awjWAew9mI9iDWDdTfrDtZNrO%2Bzvsz6LmttW20G%2FT56ZU%2BErtpWQwX8dyeTIOvBrH7WCMah%2Fus8R4JpmHRayWW9hHU862DWZNAWZn2R9XZ8fh3lItYLWPtgfu9h3cr6LOvfWaNpIKelo8hRrHezfifF87JYz2Ydxno16yOd6J67sk5kzWYVGhlg%2FTfrO6qOGLX7wEZchu9vaY%2Bclo4iRayPsg5MqnaEmWVGhgsUs1k3sr7i6fKZUnegwKsH6x%2BtObtNAVmAfY0DxNWsXVhXwADY4sM5EY%2FjaSCnpd1FvNG9yYGY52cDz81ehxNt5%2FkeZUbpa8G%2BJYa8jnUZ6OdekcCyNhqj8pp6yvJ1mPi4EbF9viqrtwxckXXOIoBfxm2NKu%2FN%2Bj18Hg7qPTWZ3EEayGlpD7mc9btJgbh6F%2FlLRhEd0oOi5fOIMrNcFc9i7Q9v1cJFNcYYyNX1Hckr%2BxzzNcMyTPbx11mfc1zrVNY71ffVrDelqXVaDhS1%2FFnb053n%2B%2B5d5BtwPPkum0TRW27kMj9wEHM9%2F2%2FZQBZZUx%2Bl7I5FrTezXgyabIC91AK6TR8yPa7V3UG%2FY2kgp%2BVAiCSpjmqzVm0N0aG9KHD9zRRbu5piH6wjyslJNE9PY%2F1zC1vg99MfQjUUZq%2Bc3XGoNd8YzU9wvMFxk40edbtZ32MJ6qaBnJZ2kwxQ6kBCT1xXxz4ohwKl0zj6O4Ki99yRzKLU4fpLgL3wvN1h2tDQSJmtQXwk6ygVi%2B6i%2BPr0ctbPKL60kw9PaEBVa8fguI9s1JNzQhYIxesWoMwHjylLZ7I%2BngXNRWy7FfV7ILzXkgfNUdeQRF9fBw4Oofh6cwD1YmgjqsBe5UH5D1KMIIJ7%2FgbGIgfXeRkxvZSdwVoM4%2FEGxROOdW2wsZMovk9A7vVjhA2f7r0BHx7WggUL5OFMoPjGApFKaXzMmDFlpjLqFCWaFVx%2FsV3G503hj0J5YHz8TsfxCQmuW6n7YJ0n51yLQRGpkGK7D1xvBv5c7Dhm2k7UTgl%2FlHj1j7Wczw1xPbnHKV79VmPc1NfRo0eXJwnknqyDEtaQ7DR7UP9PS8l3yiCKvb2SYqvf5cfepa1r52MiNxh7sLkhSqHGGHUL%2BHT8eQvrjwEw25vtZF3C%2BgPE8b8CGAKYwBdadPcvFF866wIDcCbFM9BGbkYYEQYwfohxfh2gCALMkqBia0W3sk52UGnpy0Vo53rWT1gfdFDrEwCoGIymLO29yfowwBYFSC9BAk3LODCaAPol%2FVnI%2Bgyem4lpjgej%2Bj3rcSoMkOu%2FwDqJdYN1bVkL%2FyUSc92UIZfryUaf%2B%2FBcaoJqMs9xPOQJfGw8T8iR5jvr9CSSEvbknaW%2BC5gqrHPGJwCKnCNgHSlgscBp90WuMYWPlXHdiapc11vs0baUl3l0oaSN%2B57FbUr%2FKvizqwEz%2F11pGY7pCsh9U%2FDIvWHh3RJtbPLG%2FksnkX%2FU2fEn%2Ffqr7IPYweTnt3XtLANkP6N4I8fGb9Y1Ul7zbq4CjMt5CZ53IcAg8gG84EH4fjq84E58P5HiGzYKlLfpo4BcCHAU4vsGeKA8xxiYid0P92FLNtRQc2EUh3kwnl7WeSvhoY9U5aMdQD7PYjUvwXDkqmScGALJno%2Bklll3cw9iyO5H8rFOjdNc1mM9xvxggFzamOqHF5mlPNo4NGi8RQk8qi2LPdSWax3AoQTebaZSc71i5emM4THAKnf0eYLywu0tun%2FlavJdq46HbAMCr25APJMBXplCmwPJvcmhyQtTTTX5x15A%2FgsuRlpoE%2FlfWcQzJEa%2BcJh1T3wpqg3DK9j9oL6RXgtHKKvZHF9ogVi8wXt4Nqsx2UX%2BBbAITdyo6hdYsf0Ih1cfqv42FNLIa6CQGYY1aBOGzxDabpUxYP0C%2FVkParuNWu%2FuakC9raDPYji2wFOS1fdc9V0MyzD1fSk8e8Bqww8jkI8%2BueLxkciDmJBgjgViCQ2ehKfX1xbmcmIQIDHWr1R5kMU8%2BVbi%2BBhqma4n5aXbkrHKSBTje2kCGj3D8samDyO0B1RUeZw2Llx%2FPtoQg9HuYE7QvyIcF4pdigchRnACKPYsZazuTLHZYzyPsNf1lYwi%2FxVX83SJh4hVa9fQ1kgj5fbrT926dacY0%2BtA1XYKVn7IU6xVmN2o49MMBrCsHceaQW5v9H5OTbgu8GTidVehTDzvu%2FCSxrsNRhydDZpoy3CVcBttsbrXFBjIwyMLLZ3H%2BjhAYES83DRQ7hC8rIBTNtScquq9A2dQjWsa9rCA9TLV9tGsQxTAT1f3aYxZzKOvn4NWPwMGchu13g8wFgm9H7Geosp3ILx4DmMzE%2Fflx72d48fE0hRxLLy0TMqTWX0pgNamxGNV7GuobhHKk5WQ%2FoRnM4ZntqN%2BKazbxP2dgcI4mb68rMBeBsNlxnSKiuNLdYiQpPRyg3gX%2BQaeSoHJNzA5jjvsaDRKCys%2FpZfOPJ%2BqrplKO2%2BYTjumTKOG3keQL%2BL0yvUOT6e9tU1ZD8O9RBHDfoRYcpWq84J1jUEqnDjZ0c6xoPeZoJdGqijBzjMF%2BHp4VNvTVkO3w2A1wuvaGz8i8MDbcdzQ21etuDUb4DWG5dsKtHL%2Bs67wElKG%2Bboe9Px6JAvtmJgQemh5BteO4R7nop9GjgsKxZOYErSv2KT4uawC9Gm2iwbycdd6xkzLY40x9BfxY4Xy8K5ETyGAqmPTEgu0JQow5Q6PWWkZJy3T%2BfrTvyR4X1JfTfKv3OFlSxEvFVoMonwfmj24VUkdU%2BbjTqLA1F8zUe26t%2FjDDRsoMyuLhpcMoTwur%2FcHKH%2Few5Tz4rMUzXQuq%2B5JsPQSxeS2E0P%2FAY18GfPlI6vO8wBDpsp2m8RQpvJQAcTIveHZcq04eBXoezIScAAo4FHP7zAIrrq78Gyvs%2BZkNrLRw1W5GJw1Cfpnj%2FHrqD9Ylck1D3UY7hASZ5kwWgfB%2BBjp7sfkn4hB1pPMxKUfISbdF281QVEUkYdUDFvoOK0Yk9%2BoAd1EVzb8K5ISpUWqbKwje28nz%2FaVJXRzuqMTiim2bUs8Q%2F32irhWV9PQoUMpLyeH6phGZy96mvLmP0qxjOBe6m3JzjbanuMAcw9Q4NvBPO62kkifwvPorHtPMCUj97A%2BpTLnJ%2BO4psavdoDn%2FYwFQonhjwD17acM3gJKvBZtD37YMa5iUA5xsCDJvq9FCCCG7b%2BWwcsIWt6tXNHXMQCiAG4Ol5VbE7WtFUo9sUO4Zsg6XuZIdj1kJRdKQE8Xw9vqzHWRzRZgIIoVmBIxBuNhS1KIkX1WW7MwTtLHcos2lypjVpZigqsFU2lVkplF0YVPsD98LD4DwrUU6XsMdZ12K0XZI9dxXJy5fCnlP3J%2FE4BjGV3iibHWsrWNtgVMsqx0o8c4FSDh8k3MmS3w8i9hycUA%2F1IV64tXkTevzkG5yGmWMYjA83%2FVshw6WD2LIVZC7mNybwVNVeqp%2BSWOFk%2BbvHepNWXkgzz5ZmHiV%2FBEK1UAkMSRoU6kYrxkRWer53scL0uU7AJQPsLgTUDyqlxR1RLHNaarDPd%2B3ZaExNZDyuAV68w9juuHva%2BS7RkiBoJNAPXxv7ohwyhSeDD5%2FD7KXL%2BWCu%2B%2Fi%2Fy1YYplZ3uBmJCYap4xPuceMInp3oIXOhfj3h9U0MipOPYAPJTMnckK7KXKIC3FeKxFXT%2By43rRW4693wGALPT6RYsCT4bnNLKQWq6DJxsK2Nn7KjAkn4MV3WuNt%2Fb0m%2F0KEFMcFHqE5S2TpdVFCvhl1HLJxgCvGPUSAkUljfqoGHixSiQVq3aLlQcs399PGIZmvCMxd2BEdm%2Bwt%2FVFo9TYoyeFBw1r2gAS2PI5Fdw3m%2FxfbKMYe2dK%2FCsw7xiL18DV1kSiXtv9dsLL%2FgKgHekAml5PXQ%2FvbCZtd2reSTgfiZvVKq7saeUChAnsPkAj2Zgg4UdgBrovA0GvDa1%2BLMk2tBxDLdeoRdYhQx12sJ63YBxtlWeyOghwaQo9HaAtUjFgGZJibSW7CA%2FYJLlC1sYMO3Y2XjaRVKrEko41V6LPK5FECynqFyLvJa4vC16v%2By53bHRpL0m8ob8hQvUDTqBInyPJv2M7db3vrqalplheXltn7jZMQSx6VWOUZoVqm954UnIZvM%2FzYEdVmPRyr5uo5VrnTgvIK6wsNCEuXKISXmuo9aYHs9tpf7zI4HPEqzkASzXCgC0WmOQ%2B3gOltkXuZVkS7XaxQqWfW0mtBhgEeSayA%2B1odUxCkKnwyiGVAJXQRZYHn%2FTD652sPGWRSuSEEFemmqQZ6%2BUV0Z4pH5%2FEtT62gQyv3Fd7dwVi8dYjv0Q8mqpUYIzG7cc2vD29eNtgBu0548wmD9217K%2BUWfEWxXJyk4HBKoBp7wxXa8iELLIA%2BXdI%2BixBdvZp1v9ZMXOYWi4V1SK2JEe2tkJ5s1WOOptsyt%2BO0kCt934PQPjwGmj0udZxAfizHtd7gpL7PbCJGLd5aONy67hsHX0Tf99vHZPk12%2FAUp7HOL%2BKBJu8fnmlz%2BFxSpQ3raAOLjq5hTg%2FRJ1Ekv3hw4bzR3km5Hx1YYoccyx9MeNPVDB3DuU%2BOZdBnOOVobZlpmFEAWSXSjbtaprpmBj9Ad5uSVxLkmG%2Ftcoks%2F0ktVzauRxxtJHhAEmWFXOOs%2BhoMViYV5tDABCdT7gDoYAt0wAMSgDO71tlp2As9PU%2FAwNdZ9UdgnvonuRUkA0qk5TBluGXnyW6IsnzVwQdk2lxqhPtK5ZQJ%2BxzqvKJd%2BQVpZpR51DOkhcod%2BHjPM2ykwXxblL7huXlmX%2FsClMdj1%2Bw%2Ba2nnWBPw5CjsJNuEYDrQXL%2FHtYSeNajQJPF%2Bz9l1XkbQOhHzbvMnnfElI141n7UyaSWGzsaQPvNW1NBh%2BfVyaOTEAJmWiGM2RhCjn6%2BYRlUyVR%2FmOQzrIXnzlB9fR8gfszy6jEk1GQzykUwqFmOJNwGjPH89GuMnUMELD9p5Y3D7I2P7k8%2BjpFlmSkW4DkeDLaV3DIiMehSbQD7ZQQoAGrta45hr0QSS7yyrF32Rrwnk30tchheGVuZrOdT8%2F7kPSoBpg3xONSJQTc6rrUOBsVYmSAouJH3EC8GqPnH%2BTZ79Otz5GeOQ9IpD4ZtI%2B7lcw9KvkwBuQFUOdn3mGX3213UvA%2B7Bv3z%2Bnkh2VBzG8LHXggtu8N4fgb9wtxjGsidQxYhTstrUSo%2FqheNUh7Tad%2BePfFXFpMDcQ3i3haZ2kGZgaZZZs3MKBjBJyq2TUU2tFOdOkq8HCWAWJ1Cv2oBzGVJ1peE2NmWYVmUQnubYWxSlc3QlYkq%2BdMY6RSynpp3xzXzL%2Fa%2BwU0fk39HVTLvHWu5SSVWmpGS%2Fr8KEskVoLg6jk8lH5OxPzuX9sidQ8JI6sjrfn1VtoxNcSDVa%2F2a3C%2BbpKW1yFhLRluSdhcrxyfx7D87UkfTHrnziNDKS5B02ReRZTzZDjmdOvkPzR1Akd2Hkpy7ygprHtiH57BfdxmmPXLnEslQngVASrwmyZqCBPVDiMtkk728%2BvZheghTkhUOAMo7xzOSwFWuVRZIAzktWiRbKb9RJbt8ZFtjP2hXTBazTCNxtezEkkRJVXrY9kmWU%2FMvi8gymvwXNbK9tK0fspfE4C1gPuY%2F0ntzf3b0%2FwIMAMzueRjRzYtvAAAAAElFTkSuQmCC)}}@media only screen and (max-width: 480px), only screen and (max-device-width: 480px){div.swiftype{-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}div.swiftype .st-input-inner{padding-right:0 !important}div.swiftype .st-input-powered-by{display:none !important}div.swiftype .st-result-listing{margin-left:15px !important;margin-right:15px !important}div.swiftype .st-result-wrapper .st-result-listing .st-logo-footer{display:block}#st-launcher-tab{right:20px;width:0;padding-left:13px;text-indent:-99999px}}.swiftype-widget .autocomplete{font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background-color:#fff;display:block;list-style-type:none;margin:0;padding:0;-webkit-box-shadow:0 1px 2px rgba(0,0,0,0.5);-moz-box-shadow:0 1px 2px rgba(0,0,0,0.5);box-shadow:0 1px 2px rgba(0,0,0,0.5);position:absolute;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;text-align:left}.swiftype-widget .autocomplete ul{font-family:"Helvetica Neue",Helvetica,Arial,"Lucida Grande",sans-serif;background-color:#fff;display:block;list-style-type:none;margin:0;padding:0;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;text-align:left}.swiftype-widget .autocomplete li{border-top:1px solid #e5e5e5;border-bottom:1px solid #fff;cursor:pointer;padding:10px 8px;font-size:13px;list-style-type:none;background-image:none;margin:0}.swiftype-widget .autocomplete li:first-child{border-top:1px solid #fff;-webkit-border-radius:3px 3px 0 0;-moz-border-radius:3px 3px 0 0;-ms-border-radius:3px 3px 0 0;-o-border-radius:3px 3px 0 0;border-radius:3px 3px 0 0}.swiftype-widget .autocomplete li:last-child{-webkit-border-radius:0 0 3px 3px;-moz-border-radius:0 0 3px 3px;-ms-border-radius:0 0 3px 3px;-o-border-radius:0 0 3px 3px;border-radius:0 0 3px 3px}.swiftype-widget .autocomplete li.active{border-top:1px solid #145a93;border-bottom:1px solid #086aa8;background-color:#1285d5;background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #37a3e9), color-stop(100%, #1285d5));background:-webkit-linear-gradient(#37a3e9, #1285d5);background:-moz-linear-gradient(#37a3e9, #1285d5);background:-o-linear-gradient(#37a3e9, #1285d5);background:linear-gradient(#37a3e9,#1285d5);-webkit-box-shadow:0 1px 0 #69bdf3 inset;-moz-box-shadow:0 1px 0 #69bdf3 inset;box-shadow:0 1px 0 #69bdf3 inset}.swiftype-widget .autocomplete li p{font-size:13px;line-height:16px;margin:0;padding:0;overflow:hidden}.swiftype-widget .autocomplete li p.title{font-weight:bold;color:#1c6cb5}.swiftype-widget .autocomplete li p.title em{color:#0b2644;font-style:normal;font-weight:bold}.swiftype-widget .autocomplete li.active p.title{text-shadow:0 -1px 0 rgba(0,0,0,0.3);color:#fff}.swiftype-widget .autocomplete li.active p.title em{color:#fff;font-style:normal}.swiftype-widget .autocomplete li .sections{color:#999;font-size:11px}.swiftype-widget .autocomplete li .sections em{color:#666;font-style:normal}.swiftype-widget .autocomplete li .sections .section{display:inline}.swiftype-widget .autocomplete li.active .sections{text-shadow:0 -1px 0 rgba(0,0,0,0.3);color:#a9d7f1}.swiftype-widget .autocomplete li.active .sections em{color:#a9d7f1;font-style:normal}form input.st-search-input{font-size:12px;padding:4px 9px 4px 27px;height:20px;width:200px;color:#666;border:1px solid #ccc;-webkit-border-radius:15px;-moz-border-radius:15px;-ms-border-radius:15px;-o-border-radius:15px;border-radius:15px;-webkit-box-shadow:inset 0 1px 3px 0 rgba(0,0,0,0.17);-moz-box-shadow:inset 0 1px 3px 0 rgba(0,0,0,0.17);box-shadow:inset 0 1px 3px 0 rgba(0,0,0,0.17);outline:none;background:#fcfcfc url(//s.swiftypecdn.com/assets/embed_mag-034de95a159bfc65ae00bd318e8138ed.png) no-repeat 7px 7px}@media only screen and (-webkit-device-pixel-ratio: 2){form input.st-search-input{background-image:url(//s.swiftypecdn.com/assets/embed_mag@2x-3a6ad2f01c9cbb5c710ad5d949c051b8.png);background-size:15px 15px}}.st-modal-open{overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0}.st-modal-scrollable{position:fixed;top:0;bottom:0;left:0;right:0;overflow:auto;-webkit-overflow-scrolling:touch}.st-modal{left:50%;top:50%;width:950px;margin-left:-475px;z-index:99999;outline:none;position:absolute;margin-top:0;overflow:visible}.st-modal.fullscreen{position:absolute;top:0;left:0;right:0;bottom:0;margin-left:0;width:100%}.st-modal-body{max-height:none;overflow:visible}.st-modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99998;background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 100, color-stop(5%, rgba(0,0,0,0.3)), color-stop(100%, rgba(0,0,0,0.7)));background-image:-webkit-radial-gradient(50% 50%, ellipse cover, rgba(0,0,0,0.3) 5%, rgba(0,0,0,0.7) 100%);background-image:-moz-radial-gradient(50% 50%, ellipse cover, rgba(0,0,0,0.3) 5%, rgba(0,0,0,0.7) 100%);background-image:-o-radial-gradient(50% 50%, ellipse cover, rgba(0,0,0,0.3) 5%, rgba(0,0,0,0.7) 100%);background-image:radial-gradient(50% 50%, ellipse cover, rgba(0,0,0,0.3) 5%,rgba(0,0,0,0.7) 100%)}.st-modal-backdrop.fade{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transition:opacity 0.3s;-moz-transition:opacity 0.3s;-o-transition:opacity 0.3s;transition:opacity 0.3s}.st-modal-backdrop.fade.in{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1}.st-modal-overflow.st-modal{top:20px}.st-modal-overflow.st-modal.fullscreen{top:0}.st-modal-overflow .st-modal-body{overflow:auto;-webkit-overflow-scrolling:touch}.st-animate{-webkit-animation-duration:0.3s;-moz-animation-duration:0.3s;-o-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:both;-moz-animation-fill-mode:both;-o-animation-fill-mode:both;animation-fill-mode:both}@-webkit-keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-moz-keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-o-keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-khtml-keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@-ms-keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}@keyframes modalEnter{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.8);-moz-transform:scale(0.8);-ms-transform:scale(0.8);-o-transform:scale(0.8);transform:scale(0.8)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}}.modalEnter{-webkit-animation-name:modalEnter;-moz-animation-name:modalEnter;-o-animation-name:modalEnter;animation-name:modalEnter}@-webkit-keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}@-moz-keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}@-o-keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}@-khtml-keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}@-ms-keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}@keyframes modalExit{0%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=100);opacity:1;-webkit-transform:scale(1);-moz-transform:scale(1);-ms-transform:scale(1);-o-transform:scale(1);transform:scale(1)}100%{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=0);opacity:0;-webkit-transform:scale(0.4);-moz-transform:scale(0.4);-ms-transform:scale(0.4);-o-transform:scale(0.4);transform:scale(0.4)}}.modalExit{-webkit-animation-name:modalExit;-moz-animation-name:modalExit;-o-animation-name:modalExit;animation-name:modalExit} 2 | --------------------------------------------------------------------------------