WebView 장 은 QR 코드 를 식별 하고 클릭 하여 큰 그림 을 봅 니 다.
문장 끝 에 데모 주소 가 있어 서 아주 간단 합 니 다. 글 자 를 보고 싶 지 않 으 면 demo 를 직접 볼 수 있 습 니 다.
CIDetecor
1. 먼저 로 컬 QR 코드 를 식별 해 야 합 니 다. webView 는 기본적으로 js 문장의 문제 일 뿐 입 니 다. QRcodeDetector 류 를 만 듭 니 다.
#import "YNQRCodeDetector.h"
@implementation YNQRCodeDetector
+ (CIQRCodeFeature *)yn_detectQRCodeWithImage:(UIImage *)image {
// 1.
CIContext *context = [[CIContext alloc] init];
// 2.
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
// 3.
CIImage *imageCI = [[CIImage alloc] initWithImage:image];
NSArray *features = [detector featuresInImage:imageCI];
CIQRCodeFeature *codeF = (CIQRCodeFeature *)features.firstObject;
return codeF;
}
@end
2. 로 컬 imageView 에 제스처 를 추가 하고 QR 코드 인식 링크 를 처리 하 며 QR 코드 디 스 플레이 저장 과 식별 이 있 으 며 저장 만 표시 되 지 않 습 니 다.
- (void)imageLongPress {
UIAlertController *ac = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
CIQRCodeFeature *codeF = [YNQRCodeDetector yn_detectQRCodeWithImage:self.imageView.image];
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}]];
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self savePicture];
}]];
if (codeF.messageString) {
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
//
SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:codeF.messageString]];
[self presentViewController:safariVC animated:YES completion:nil];
}]];
}
[self presentViewController:ac animated:YES completion:nil];
}
3. 그림 저장 은 할 말 이 없습니다. iOS 10 이후 수 동 으로 앨범 권한 을 켜 는 것 을 기억 하 세 요.
- (void)savePicture {
if (self.imageView.image == nil) {
// [SVProgressHUD showErrorWithStatus:@" "];
} else {
UIImageWriteToSavedPhotosAlbum(self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
}
}
- (void)image:(UIImage *)image
didFinishSavingWithError:(NSError *)error
contextInfo:(void *)contextInfo {
if (error) {
// [SVProgressHUD showErrorWithStatus:@" "];
} else {
// [SVProgressHUD showSuccessWithStatus:@" "];
}
}
WebView 의 일부 처리
WebView 긴 제스처 추가
프로젝트 수요 로 인해 고 쳐 야 할 부분 이 너무 많 습 니 다. 저 는 사용자 정의 WebView 에 직접 쓰 고 webView 를 직접 바 꾸 면 됩 니 다. 회사 가 필요 로 하 는 웹 은 너무 복잡 한 기능 이 없 기 때문에 사용자 정의 webView 에 직접 쓰 면 됩 니 다.
사용자 정의 웹 뷰 제스처 추가:
- (instancetype)init {
self = [super init];
if (self) {
[self basicConfigure];
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self basicConfigure];
}
return self;
}
- (void)basicConfigure {
self.delegate = self;
UILongPressGestureRecognizer *longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPressWebPic:)];
longPress.delegate = self;
[self addGestureRecognizer:longPress];
}
- (void)longPressWebPic:(UILongPressGestureRecognizer *)recognizer {
if (recognizer.state != UIGestureRecognizerStateBegan) {
return;
}
// ,
CGPoint touchPoint = [recognizer locationInView:self];
NSString *imgURL = [NSString stringWithFormat:@"document.elementFromPoint(%f, %f).src", touchPoint.x, touchPoint.y];
NSString *urlToSave = [self stringByEvaluatingJavaScriptFromString:imgURL];
if (urlToSave.length == 0) {
return;
}
// ENLog(@"%@", urlToSave);
[self imageWithUrl:urlToSave];
}
사진 다운로드
// demo , sdImageDownloader
- (void)imageWithUrl:(NSString *)imageUrl {
// , , alertController
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSURL *url = [NSURL URLWithString:imageUrl];
NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue new]];
NSURLRequest *imgRequest = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30.0];
NSURLSessionDownloadTask *task = [session downloadTaskWithRequest:imgRequest completionHandler:^(NSURL * _Nullable location, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
return ;
}
NSData *imageData = [NSData dataWithContentsOfURL:location];
// UI
dispatch_async(dispatch_get_main_queue(), ^{
UIImage *image = [UIImage imageWithData:imageData];
UIAlertController *ac = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
CIQRCodeFeature *codeF = [YNQRCodeDetector yn_detectQRCodeWithImage:image];
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}]];
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
[self savePicture:image];
}]];
if (codeF.messageString) {
[ac addAction:[UIAlertAction actionWithTitle:@" " style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
SFSafariViewController *safariVC = [[SFSafariViewController alloc] initWithURL:[NSURL URLWithString:codeF.messageString]];
[[self currentViewController] presentViewController:safariVC animated:YES completion:nil];
}]];
}
// webView
[[self currentViewController] presentViewController:ac animated:YES completion:nil];
});
}];
[task resume];
});
}
최상 위 컨트롤 러 가 져 오기
- (UIViewController *)currentViewController {
UIWindow *keyWindow = [UIApplication sharedApplication].keyWindow;
UIViewController *vc = keyWindow.rootViewController;
while (vc.presentedViewController) {
vc = vc.presentedViewController;
if ([vc isKindOfClass:[UINavigationController class]]) {
vc = [(UINavigationController *)vc visibleViewController];
} else if ([vc isKindOfClass:[UITabBarController class]]) {
vc = [(UITabBarController *)vc selectedViewController];
}
}
return vc;
}
- (UINavigationController *)currentNavigationController {
return [self currentViewController].navigationController;
}
WebView 에이전트 처리 (js 처리)
- (void)webViewDidFinishLoad:(UIWebView *)webView {
//
[self stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
NSString * jsCallBack = @"window.getSelection().removeAllRanges();";
[webView stringByEvaluatingJavaScriptFromString:jsCallBack];
//js
static NSString * const jsGetImages =
@"function getImages(){\
var objs = document.getElementsByTagName(\"img\");\
for(var i=0;i
데모 주소
YNQRCodeWebView
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.