web-dev-qa-db-ja.com

プログラムで画面よりも小さいサイズのiOSWKWebViewを作成しようとしています

私は、WKWebViewを使用してWebビューを表示するだけの単純なアプリから始めています。常にフルスクリーンであることを除いて、すべてが構築され、問題なく動作します。理想的には、上部のiOSステータスバーの下には拡張されません。その下にするには、20px下げる必要があります。私は解決策を広範囲に探しましたが、サイズを変えるものは何もありません。 InterfaceBuilderには何も設定されていません。私はすべてをプログラムで行っています。 Swiftの使用。

これは、WKWebViewを備えた多くのアプリが行う基本的なことのようです。シンプルなはずです。私はおそらく明らかな何かを見逃しています。どんな助けでも大歓迎です。前もって感謝します。

これは私がこれまでに持っているものです:

import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate  {

    let url = NSURL(string:"http://stackoverflow.com")
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        webView = WKWebView(frame: CGRect( x: 0, y: 20, width: 380, height: 150 ), configuration: WKWebViewConfiguration() )
        self.view = webView
        self.view.frame = webView.frame
        let req = NSURLRequest(URL:url!)
        webView.loadRequest(req)
        self.webView.allowsBackForwardNavigationGestures = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

エミリオありがとう!調整されたコードは完全に機能します!

import UIKit
import WebKit
class ViewController: UIViewController, UIGestureRecognizerDelegate , UIWebViewDelegate, WKNavigationDelegate  {

    let url = NSURL(string:"http://stackoverflow.com")
    var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        webView = WKWebView(frame: CGRect( x: 0, y: 20, width: self.view.frame.width, height: self.view.frame.height - 20 ), configuration: WKWebViewConfiguration() )
        self.view.addSubview(webView)
         let req = NSURLRequest(URL:url!)
        webView.loadRequest(req)
        self.webView.allowsBackForwardNavigationGestures = true
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}
13
Eddie

あなたの問題は、特定の方法で提示されたUIViewControllersが彼らのビューのフレームを管理することです。たとえば、ルートコントローラーとして、またはナビゲーションバーでモーダルに提示する場合、名声を手動で設定しても効果はありません。 (これらはほんの数例です)。

ビューのフレームを管理する場合は、ビューコントローラーのwebViewにサブビューとしてviewを追加できます。その場合、フレームの変更は機能します。

私が指摘したいことの1つは、self.view.frame = webView.frameを呼び出した後にself.view = webViewを呼び出すことは、両方とも同じオブジェクトであるため冗長であるということです。したがって、効果的に行うことは次のとおりです。

self.view.frame = self.view.frame
4
EmilioPelaez

私はいくつかのアイコンのためのスペースを作るのが嫌いで、これを修正するのに多くの時間を費やしています。解決策は、viewDidAppear関数に調整を配置することでした。

import UIKit
import WebKit

class ViewController: UIViewController {
    let webView  = WKWebView()
    let url_base = "http://www.ztatz.nl"

     override func loadView() {
         self.view = webView
         webView.addObserver(self, forKeyPath: #keyPath(WKWebView.estimatedProgress), 
         options: .new, context: nil)
     }

      override func observeValue(forKeyPath keyPath: String?, of object: Any?, 
        change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "estimatedProgress" {
            print(Float(webView.estimatedProgress))
        }
    }

     override func viewDidLoad() {
        super.viewDidLoad()
        webView.load( url_base )
     }

     override func viewDidAppear(_ animated: Bool) {
        self.webView.frame   = CGRect(x: 0, y: 0, width: self.view.frame.width, 
        height: self.view.frame.height - 100)
        }

   }

   extension WKWebView {
       func load(_ urlString: String) {
          if let url = URL(string: urlString) {
           let request = URLRequest(url: url)
           load(request)
        }
       }
    }
0
Wil