今天來(lái)分享一下開(kāi)發(fā)flutter遇到的一兩個(gè)問(wèn)題:
問(wèn)題一:
flutter打開(kāi)原生的WKWebView頁(yè)面娜亿,想要禁止用戶(hù)長(zhǎng)按操作挠蛉。
親測(cè)無(wú)效的各種:
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
webView.evaluateJavaScript("document.documentElement.style.webkitTouchCallout='none';", completionHandler: nil)
webView.evaluateJavaScript("document.documentElement.style.webkitUserSelect='none';", completionHandler: nil)
}
if (@available(iOS 11.0, *)){
for (UIView* subview in wkWebView.scrollView.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"WKContentView")])
{
for (UIGestureRecognizer* longPress in subview.gestureRecognizers) {
if ([longPress isKindOfClass:UILongPressGestureRecognizer.class]) {
[subview removeGestureRecognizer:longPress];
return;
}
}
}
}
}
for (UIView* subview in wkWebView.scrollView.subviews) {
if ([subview isKindOfClass:NSClassFromString(@"WKContentViewMinusAccessoryView")])
{
for (UIGestureRecognizer* longPress in subview.gestureRecognizers) {
if ([longPress isKindOfClass:UILongPressGestureRecognizer.class]) {
[subview removeGestureRecognizer:longPress];
}
}
}
}
//禁止選擇 css 配置相關(guān)
NSString*css = @"body{-webkit-user-select:none;-webkit-user-drag:none;}";
//css 選中樣式取消
NSMutableString*javascript = [NSMutableStringstring];
[javascript appendString:@"var style = document.createElement('style');"];
[javascript appendString:@"style.type = 'text/css';"];
[javascript appendFormat:@"var cssContent = document.createTextNode('%@');", css];
[javascript appendString:@"style.appendChild(cssContent);"];
[javascript appendString:@"document.body.appendChild(style);"];
[javascript appendString:@"document.documentElement.style.webkitUserSelect='none';"];//禁止選擇
[javascript appendString:@"document.documentElement.style.webkitTouchCallout='none';"];//禁止長(zhǎng)按
//javascript 注入
WKUserScript *noneSelectScript = [[WKUserScript alloc] initWithSource:javascript
injectionTime:WKUserScriptInjectionTimeAtDocumentEnd
forMainFrameOnly:YES];
WKUserContentController*userContentController = [[WKUserContentControlleralloc] init];
[userContentController addUserScript:noneSelectScript];
WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc] init];
configuration.userContentController = userContentController;
// 最后加載進(jìn)入js
[self.wkWebView.configuration.userContentControlleraddUserScript:noneSelectScript];
下面是解決方法
- 簡(jiǎn)要描述:開(kāi)發(fā)環(huán)境:Xcode:11.2 ,iOS:13.2莺奸。然后自己創(chuàng)建一個(gè)UILongPressGestureRecognizer替換掉系統(tǒng)的罩句,即可裳朋。
第一步:
private var longP : UILongPressGestureRecognizer?
第二步:
let longP_ = UILongPressGestureRecognizer.init(target: self, action: #selector(longTapAction))
longP = longP_
longP!.delegate = self
WKWeb.addGestureRecognizer(longP!)
第三步:實(shí)現(xiàn)代理方法 <UIGestureRecognizerDelegate>
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if gestureRecognizer == longP {
return true
} else {
return false
}
}
- 說(shuō)明:
/// 此方法指定只有g(shù)estureRecognizer被系統(tǒng)判定失敗時(shí),才會(huì)執(zhí)行otherGestureRecognizer
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRequireFailureOfGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
/// 此方法指定只有otherGestureRecognizer被系統(tǒng)判定失敗時(shí)翠语,才會(huì)執(zhí)行
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer NS_AVAILABLE_IOS(7_0);
問(wèn)題二:
flutter在自動(dòng)橫豎屏切換的問(wèn)題
問(wèn)題描述:在開(kāi)發(fā)flutter的時(shí)候叽躯,有的視頻播放頁(yè)面需要進(jìn)行橫屏切換财边,結(jié)果只顯示了一半肌括。
下面是解決方法
- 簡(jiǎn)要描述:開(kāi)發(fā)環(huán)境同上,視頻播放用的是WKWebView
第一步:添加監(jiān)聽(tīng)
UIDevice.current.beginGeneratingDeviceOrientationNotifications()
NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: UIDevice.orientationDidChangeNotification, object: nil)
第二步:
@objc func deviceOrientationDidChange() {
WKWeb.frame = UIScreen.main.bounds
}
問(wèn)題三:
禁止截屏酣难,錄屏
// 禁止截屏
weak var weakSelf = self
NotificationCenter.default.addObserver(forName: UIApplication.userDidTakeScreenshotNotification, object: nil, queue: OperationQueue.main) { (_) in
print("接到用戶(hù)截屏的通知....")
weakSelf?.notificationScreenshot()
}
// 禁止錄屏
if #available(iOS 11.0, *) {
if UIScreen.main.isCaptured {
NotificationCenter.default.addObserver(forName: UIScreen.capturedDidChangeNotification, object: nil, queue: OperationQueue.main) { (_) in
weakSelf?.notificationScreenshot()
}
}
} else {
// Fallback on earlier versions
}
- 說(shuō)明谍夭,一定要在AppDelegate中注冊(cè)監(jiān)聽(tīng),否則回調(diào)有時(shí)候不好使憨募。