В приложении iOS я использую WKWebView для загрузки изображения SVG.Внутри этого SVG есть ссылки, которые связаны с данными внутри другого объекта.Я использую метод делегирования навигации, чтобы проверить, нажата ли ссылка (например, flowchart://{id}
).Для устройств iPad я хочу, чтобы исходный прямоугольник ссылки был нажат, чтобы показать детальный контроллер внутри всплывающего окна.Приведенный ниже код работает для устройств не-iPad, но как получить прямоугольник нажатой ссылки?
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
if ([navigationAction navigationType] == WKNavigationTypeLinkActivated) {
if ([[[[navigationAction request] URL] scheme] isEqualToString:@"flowchart"]) {
NSMutableArray *components = [[[[navigationAction request] URL] pathComponents] mutableCopy];
[components removeObjectAtIndex:0]; // First element is a slash.
NSInteger identifier = [[components firstObject] integerValue];
Section *section = [self getSectionForID:identifier];
SectionViewController *details = [LocalizedStoryboard(@"Main") instantiateViewControllerWithIdentifier:@"SectionViewController"];
[details setContent:[section content]];
[[details navigationItem] setTitle:[section title]];
if (iPad) { // Macro to check if device is an iPad.
CGRect rect = CGRectZero; // Get the location of the link.
SectionNavigationViewController *popover = [LocalizedStoryboard(@"Main") instantiateViewControllerWithIdentifier:@"SectionNavigationViewController"];
[popover setViewControllers:@[details] animated:NO];
[popover setModalPresentationStyle:UIModalPresentationPopover];
[popover setPreferredContentSize:CGSizeMake(400.0f, 400.0f)];
[[popover popoverPresentationController] setDelegate:self];
[[popover popoverPresentationController] setPermittedArrowDirections:UIPopoverArrowDirectionAny];
[[popover popoverPresentationController] setSourceRect:rect];
[[popover popoverPresentationController] setSourceView:webView];
[self presentViewController:popover animated:YES completion:nil];
} else {
[[self navigationController] pushViewController:details animated:YES];
}
} else {
[[UIApplication sharedApplication] openURL:[[navigationAction request] URL] options:@{} completionHandler:^(BOOL success) { ; }];
}
}
decisionHandler([navigationAction navigationType] >= 0 ? WKNavigationActionPolicyCancel : WKNavigationActionPolicyAllow);
}