So i'm using code based off an epub reader app and im trying to modify it to get swipe gestures to work. I simply need left and right gestures to change the page forward or backward and bounds checking for end or start of epub. Ive identified the code that switches pages and theyre attached to the next and previous button functions of that invoke java script to do this. The function that loads the java script and the WKWebView is in the function - (void)loadView
The function is below, my attempt is the *UISwipeGestureRecognizer
declaration that has been commented out.
- (void)loadView {
self.view = [[UIView alloc] init];
self.view.backgroundColor = [UIColor whiteColor];
// Notifications
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc addObserver:self selector:@selector(onEPubSettingsDidChange:)
name:kSDKLauncherEPubSettingsDidChange object:nil];
// Create the web view. The choice of web view type is based on the existence of the WKWebView
// class, but this could be decided some other way.
// The "no optimize" RequireJS option means that the entire "readium-shared-js" folder must be copied in to the OSX app bundle's "scripts" folder! (including "node_modules" subfolder, which is populated when invoking the "npm run prepare" build command) There is therefore some significant filesystem / size overhead, but the benefits are significant too: no need for the WebView to fetch sourcemaps, and to attempt to un-mangle the obfuscated Javascript during debugging.
// However, the recommended development-time pattern is to invoke "npm run build" in order to refresh the "build-output" folder, with the RJS_UGLY environment variable set to "false" or "no". This way, the RequireJS single/multiple bundle(s) will be in readable uncompressed form.
//NSString* readerFileName = @"reader_RequireJS-no-optimize.html";
//NSString* readerFileName = @"reader_RequireJS-multiple-bundles.html";
NSString* readerFileName = @"reader_RequireJS-single-bundle.html";
if ([WKWebView class] != nil) {
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
config.allowsInlineMediaPlayback = YES;
config.mediaPlaybackRequiresUserAction = NO;
// Configure a "readium" message handler, which is used by host_app_feedback.js.
WKUserContentController *contentController = [[WKUserContentController alloc] init];
[contentController addScriptMessageHandler:self name:@"readium"];
config.userContentController = contentController;
WKWebView *webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
m_webViewWK = webView;
webView.hidden = YES;
webView.scrollView.bounces = NO;
webView.allowsBackForwardNavigationGestures = YES;
[self.view addSubview:webView];
// RDPackageResourceConnection looks at corePaths and corePrefixes in the following
// query string to determine what core resources it should provide responses for. Since
// WKWebView can't handle file URLs, the web server must provide these resources.
NSString *url = [NSString stringWithFormat:
@"%@%@?"
@"corePaths=readium-shared-js_all.js,readium-shared-js_all.js.map,epubReadingSystem.js,host_app_feedback.js,sdk.css&"
@"corePrefixes=readium-shared-js",
m_package.rootURL,
readerFileName];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:url]]];
//attempted swipe gestures, maybe create seperate function not sure if this is the best method
/*UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
swipeRight.delegate = self.view;
[webView addGestureRecognizer:swipeRight];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft.delegate = self.view;
[webView addGestureRecognizer:swipeLeft];/*
}
else {
UIWebView *webView = [[UIWebView alloc] init];
m_webViewUI = webView;
webView.delegate = self;
webView.hidden = YES;
webView.scalesPageToFit = YES;
webView.scrollView.bounces = NO;
webView.allowsInlineMediaPlayback = YES;
webView.mediaPlaybackRequiresUserAction = NO;
[self.view addSubview:webView];
NSURL *url = [[NSBundle mainBundle] URLForResource:readerFileName withExtension:nil];
[webView loadRequest:[NSURLRequest requestWithURL:url]];
//attempted swipe gestures, maybe create seperate function
/*UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)];
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
//swipeRight.delegate = self;
[webView addGestureRecognizer:swipeRight];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)];
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
//swipeLeft.delegate = self;
[webView addGestureRecognizer:swipeLeft];*/
}
}
Any help will be very much appreciated, ive already asked the original developers for help but they havent responded yet. I thought I would get someone else's opinion.
Thanks
Found a solution. I used UISwipeGestureRecogniser
a delegated a swipe actions on both UIWebview
and WKWebview
, then i created functions to handle these actions. Although this code is specific to this framework it may be relevant to someone. My code is below:
-(void) viewDidLoad{
[super viewDidLoad];
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeRightAction:)];
//swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
[swipeRight setDirection:UISwipeGestureRecognizerDirectionRight];
//swipeRight.delegate = self;
[m_webViewUI addGestureRecognizer:swipeRight];
[m_webViewWK addGestureRecognizer:swipeRight];
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeLeftAction:)];
//swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
[swipeLeft setDirection:UISwipeGestureRecognizerDirectionLeft];
//swipeLeft.delegate = self;
[m_webViewUI addGestureRecognizer:swipeLeft];
[m_webViewWK addGestureRecognizer:swipeLeft];}
I then mapped the back and forward gestures to page turns:
-(void)swipeLeftAction:(UISwipeGestureRecognizer *) swipe{
[self executeJavaScript:@"ReadiumSDK.reader.openPageNext()" completionHandler:nil];
NSLog(@"%s","Swipe Left");}
-(void)swipeRightAction:(UISwipeGestureRecognizer *) swipe{
[self executeJavaScript:@"ReadiumSDK.reader.openPagePrev()" completionHandler:nil];
NSLog(@"%s","Swipe Right");
Bounds checking is handle by the frameworks java script.