웹뷰의 콘텐츠를 캡쳐 방지 해야한다..!
크기가 큰 이미지를 나열해서 보여줘야해서 webView를 사용하기로 했다.
(url에서 이미지를 다운로드할 경우 속도가 느렸기 때문이다.)
이미지들은 webView를 사용해서 load한다.(나중에 적어놓겠다.)
그리고...
보여지는 이미지들은 캡쳐가 되면 안된다!
아 캐쉽지 UITextField
의 isSecuretextEntry
를 사용하면 된다고 익히 들었다.
webView의 contentOffset
을 사용해야하기 때문에 webView는 viewController의 view가 되어야한다.
import WKWebView
//..
var webView = WKWebView()
func viewDidLoad() {
super.viewDidload()
/* set webView ... */
view = webView
}
view.addSubView(webView)
를 할경우엔, webView.scrollView
를 가져오지 못했다.
makeSecure()
캡쳐 방지를 위해 사용하는 방법이다.
extension UIView {
func makeSecure() {
let field = UITextField()
let view = UIView(frame: CGRect(x: 0, y: 0, width: field.frame.self.width, height: field.frame.self.height))
field.isSecureTextEntry = true
field.isEnabled = false
field.isSelected = false
self.addSubview(field)
self.layer.superlayer?.addSublayer(field.layer)
field.layer.sublayers?.last!.addSublayer(self.layer)
field.leftView = view
field.leftViewMode = .always
}
}
코드를 봤을때 이해가 안가서 그림을 그려봤다
분홍 : textField
검정 : 캡쳐방지할 view(HideView)
textField의 layer~View 사이에 hideView를 넣는 원리인거같다.
webView를
webView.makeSecure()
했더니 캡쳐 방지가 안된다^^!
사용할 Viewer(이미지가 보여질) 의 ViewController의 view를 위와 같이 대체하고, view.makeSecure()
를 셋팅.
layer 사이클 오류가 발생했다...!
아무래도 viewController의 view의 superLayer
self.layer.superlayer?.addSublayer(field.layer)
field.layer.sublayers?.last!.addSublayer(self.layer)
해당 두줄떄문에 나는 오류인것같은데..
viewController view의 superLayer는 자기 자신인가?..
webView를 따로 ViewController로 분리한 후,
사용할 ReaderView에서 ChildViewController로 사용.
해당 webView(Controller)를 바로 viewController view에 add Child해줬다.
그러고 나서
webViewController.view.makeSecure()를 했다.
navigation stack 간 이동을 하는데, 터치가 안되는것이다..!
secure된 Layer가 사라지지 않고 남아있는것이다..!
ReaderViewController 구조
[ bottom - - - - - - > top ]
viewController view에 contentView라는 뷰를 임의로 추가 해 준 후 여기다가
contentView.makeSecure()
했다!
성공이다.
will Dissapear 할때 child를 remove 했다.
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.children.forEach { child in
child.willMove(toParent: nil)
child.view.removeFromSuperview()
child.removeFromParent()
}
}