Implement main webView functionality
- functionality for adding and deleting web views - functionality for typing addresses in the search bar and triggering page loads in the active web view
This commit is contained in:
parent
42c0d46cec
commit
08b3c12008
|
@ -40,15 +40,29 @@
|
|||
</constraints>
|
||||
<viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
|
||||
</view>
|
||||
<navigationItem key="navigationItem" id="nfO-E2-nuf"/>
|
||||
<navigationItem key="navigationItem" id="nfO-E2-nuf">
|
||||
<rightBarButtonItems>
|
||||
<barButtonItem systemItem="add" id="D7y-wQ-NkI">
|
||||
<connections>
|
||||
<action selector="addWebView:" destination="BYZ-38-t0r" id="qBD-ti-G5m"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
<barButtonItem systemItem="trash" id="nBz-Mn-Hrb">
|
||||
<connections>
|
||||
<action selector="deleteWebView:" destination="BYZ-38-t0r" id="zJa-Jg-Fk1"/>
|
||||
</connections>
|
||||
</barButtonItem>
|
||||
</rightBarButtonItems>
|
||||
</navigationItem>
|
||||
<connections>
|
||||
<outlet property="addressBar" destination="jYU-dR-unr" id="9D7-0X-x74"/>
|
||||
<outlet property="deleteWebViewButton" destination="nBz-Mn-Hrb" id="JrK-bc-UYZ"/>
|
||||
<outlet property="stackView" destination="Wqs-Qr-mVC" id="6eG-0Q-lNL"/>
|
||||
</connections>
|
||||
</viewController>
|
||||
<placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/>
|
||||
</objects>
|
||||
<point key="canvasLocation" x="934.53237410071949" y="133.81294964028777"/>
|
||||
<point key="canvasLocation" x="939" y="134"/>
|
||||
</scene>
|
||||
<!--Navigation Controller-->
|
||||
<scene sceneID="sYu-kN-pLc">
|
||||
|
|
|
@ -7,16 +7,128 @@
|
|||
//
|
||||
|
||||
import UIKit
|
||||
import WebKit
|
||||
|
||||
let defaultTitle = "Web View Wonderland"
|
||||
|
||||
class HomeViewController: UIViewController {
|
||||
@IBOutlet weak var addressBar: UITextField!
|
||||
@IBOutlet weak var stackView: UIStackView!
|
||||
@IBOutlet weak var deleteWebViewButton: UIBarButtonItem!
|
||||
|
||||
lazy var defaultURL = URL(string: "https://developer.apple.com/develop/")!
|
||||
|
||||
weak var activeWebView: WKWebView! {
|
||||
didSet {
|
||||
activeWebViewChanged()
|
||||
}
|
||||
}
|
||||
|
||||
override func viewDidLoad() {
|
||||
super.viewDidLoad()
|
||||
// Do any additional setup after loading the view, typically from a nib.
|
||||
addressBar.delegate = self
|
||||
setupDefaultUI()
|
||||
}
|
||||
|
||||
|
||||
func activeWebViewChanged() {
|
||||
if activeWebView == nil {
|
||||
setupDefaultUI()
|
||||
} else {
|
||||
title = activeWebView.title
|
||||
deleteWebViewButton.isEnabled = true
|
||||
|
||||
for view in stackView.arrangedSubviews {
|
||||
view.layer.borderWidth = 0
|
||||
}
|
||||
|
||||
activeWebView.layer.borderWidth = 3
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func setupDefaultUI() {
|
||||
deleteWebViewButton.isEnabled = false
|
||||
title = defaultTitle
|
||||
}
|
||||
|
||||
func replaceActiveWebView(afterDeletingFromIndex previousIndex: Int) {
|
||||
if stackView.arrangedSubviews.isEmpty {
|
||||
activeWebView = nil
|
||||
} else {
|
||||
// if that was the last web view in the stack, move the index back one
|
||||
let targetIndex = min(previousIndex, stackView.arrangedSubviews.count - 1)
|
||||
|
||||
activeWebView = stackView.arrangedSubviews[targetIndex] as? WKWebView ?? nil
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@IBAction func deleteWebView(_ sender: Any) {
|
||||
guard activeWebView != nil else { return }
|
||||
|
||||
if let index = stackView.arrangedSubviews.firstIndex(of: activeWebView) {
|
||||
stackView.removeArrangedSubview(activeWebView)
|
||||
activeWebView.removeFromSuperview()
|
||||
|
||||
replaceActiveWebView(afterDeletingFromIndex: index)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@IBAction func addWebView(_ sender: Any) {
|
||||
let webView = WKWebView()
|
||||
let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(webViewTapped))
|
||||
|
||||
webView.navigationDelegate = self
|
||||
webView.layer.borderColor = UIColor.blue.cgColor
|
||||
|
||||
gestureRecognizer.delegate = self
|
||||
webView.addGestureRecognizer(gestureRecognizer)
|
||||
|
||||
stackView.addArrangedSubview(webView)
|
||||
webView.load(URLRequest(url: defaultURL))
|
||||
|
||||
activeWebView = webView
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension HomeViewController: WKNavigationDelegate {
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
extension HomeViewController: UITextFieldDelegate {
|
||||
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
|
||||
if activeWebView != nil, let address = addressBar.text {
|
||||
if let url = URL(string: address) {
|
||||
activeWebView.load(URLRequest(url: url))
|
||||
}
|
||||
}
|
||||
|
||||
textField.resignFirstResponder()
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
extension HomeViewController: UIGestureRecognizerDelegate {
|
||||
/**
|
||||
Tell iOS we want our own gesture recognizer to trigger alongside the recognizers built in to each WKWebView
|
||||
*/
|
||||
func gestureRecognizer(
|
||||
_ gestureRecognizer: UIGestureRecognizer,
|
||||
shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer
|
||||
) -> Bool {
|
||||
return true
|
||||
}
|
||||
|
||||
@objc func webViewTapped(sender: UITapGestureRecognizer) {
|
||||
if let webView = sender.view as? WKWebView {
|
||||
activeWebView = webView
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue