質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.35%

  • Swift

    7625questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4302questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4150questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • iPhone

    1015questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

swift4 デバイスローテイトするとバナーが表示されない

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 479

harima

score 14

以前は正常にデバイスの向きに合ったバナーが表示されていたのですが、xcode9を使い出して、横向きの時にバナーが表示されないようになりました。申し訳ありませんが、どなたか対策を教えていただけないでしょうか?

import UIKit
import WebKit
import GoogleMobileAds
import CoreLocation

class ViewController: UIViewController, WKUIDelegate, WKNavigationDelegate, GADBannerViewDelegate {

    var myWebView: WKWebView!
    var locationManager: CLLocationManager!
    var bannerView: GADBannerView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let devMaxWidth  : CGFloat = self.view.bounds.width
        let devMaxHeight : CGFloat = self.view.bounds.height
        print("\(devMaxWidth)" + "," + "\(devMaxHeight)")

        locationManager = CLLocationManager() // インスタンスの生成
        locationManager.delegate = self // CLLocationManagerDelegateプロトコルを実装するクラスを指定する

        // WebViewの生成.
        if ((devMaxWidth == 375.0) && (devMaxHeight == 812.0)){
            myWebView = WKWebView(frame: CGRect(x: 0.0, y: 50.0, width: devMaxWidth, height: devMaxHeight - 150.0 ))
            print("iPhone X")
        } else {
            myWebView = WKWebView(frame: CGRect(x: 0.0, y: 20.0, width: devMaxWidth, height: devMaxHeight - 70.0 ))
            print("iPhone")
        }
        myWebView.translatesAutoresizingMaskIntoConstraints = false
        myWebView.isUserInteractionEnabled = true
        myWebView.uiDelegate = self
        myWebView.navigationDelegate = self
        myWebView.allowsBackForwardNavigationGestures = true
        self.view.addSubview(myWebView)

        let url = URL(string: "https://www.google.co.jp")
        let request = URLRequest(url: url!)
        self.myWebView.load(request)

        bannerView = GADBannerView(adSize: kGADAdSizeSmartBannerPortrait)
        if ((devMaxWidth == 375.0) && (devMaxHeight == 812.0)){
            bannerView.frame = CGRect(x: 0.0, y: devMaxHeight - 100.0, width: devMaxWidth, height: 50)
            print("iPhone X")
        } else {
            bannerView.frame = CGRect(x: 0.0, y: devMaxHeight - 50.0, width: devMaxWidth, height: 50)
            print("iPhone")
        }
        bannerView.backgroundColor = UIColor.black
        self.view.addSubview(bannerView)
        bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
        bannerView.rootViewController = self
        bannerView.load(GADRequest())
    }

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



    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("ページ読み込み完了しました!")
    }

    func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
        print("ページ読み込み開始しました!")
    }

    func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
        print("エラー1:\(error)")
    }

    func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) {
        print("エラー2:\(error)")
    }

    func webView(_ webView: WKWebView, didReceiveServerRedirectForProvisionalNavigation navigation: WKNavigation!) {
        let currenturl = self.myWebView.url
        print("リダイレクト:\(String(describing: currenturl))")

    }


    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
        guard let url = navigationAction.request.url else {
            return nil
        }

        guard let targetFrame = navigationAction.targetFrame, targetFrame.isMainFrame else {
            webView.load(URLRequest(url: url))
            return nil
        }
        return nil
    }


    override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)
        // デバイスのサイズチェック
        let devMaxWidth  : CGFloat = self.view.bounds.width
        let devMaxHeight : CGFloat = self.view.bounds.height
        print("\(devMaxWidth)" + "," + "\(devMaxHeight)")

        // デバイスの回転検知

        switch UIDevice.current.orientation {
        case UIDeviceOrientation.landscapeLeft:
            print("左が上")
            break
        case UIDeviceOrientation.landscapeRight:
            print("右が上")
            if ((devMaxWidth == 375.0) && (devMaxHeight == 812.0)){
                print("iPhone X")
                myWebView.frame     = CGRect(x: 50.0, y: 0.0,                width: devMaxHeight - 100.0, height: devMaxWidth - 50)
                bannerView.frame    = CGRect(x: 50.0, y: devMaxWidth - 50.0, width: devMaxHeight - 100,    height: 50)
            } else {
                print("iPhone")
                myWebView.frame     = CGRect(x: 0.0, y: 20.0,               width: devMaxHeight - 50.0, height: devMaxWidth - 70.0)
                bannerView.frame    = CGRect(x: 0.0, y: devMaxWidth - 70.0, width: devMaxHeight,        height: 50.0)
            }
            break
        case UIDeviceOrientation.portrait:
            print("上向き")
            if ((devMaxWidth == 812.0) && (devMaxHeight == 375.0)){
                print("iPhone X")
                myWebView.frame     = CGRect(x: 0.0, y: 50.0,                width: devMaxHeight, height: devMaxWidth - 150.0)
                bannerView.frame    = CGRect(x: 0.0, y: devMaxWidth - 100.0, width: devMaxHeight, height: 50.0)
            } else {
                print("iPhone")
                myWebView.frame     = CGRect(x: 0.0, y: 20.0,                width: devMaxHeight, height: devMaxWidth - 70.0)
                bannerView.frame    = CGRect(x: 0.0, y: devMaxWidth - 50.0,  width: devMaxHeight, height: 50.0)
            }
            break
        default:
            print("下向き")
            break
        }
    }


    override var prefersStatusBarHidden: Bool {
        return false
    }
}


extension ViewController: CLLocationManagerDelegate, UIAlertViewDelegate {
    func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
        switch status {
        case .notDetermined:
            print("ユーザーはこのアプリケーションに関してまだ選択を行っていません")
            locationManager.requestWhenInUseAuthorization() // 起動中のみの取得許可を求める
            break
        case .denied:
            print("ローケーションサービスの設定が「無効」になっています (ユーザーによって、明示的に拒否されています)")
            let alert = UIAlertController(title: "ローケーションサービスの設定が「無効」になっています。", message: "「設定 > プライバシー > 位置情報サービス で、位置情報サービスの利用を許可して下さい」", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            self.present(alert, animated: true, completion:  nil)
            // 「設定 > プライバシー > 位置情報サービス で、位置情報サービスの利用を許可して下さい」を表示する
            break
        case .restricted:
            print("このアプリケーションは位置情報サービスを使用できません(ユーザによって拒否されたわけではありません)")
            let alert = UIAlertController(title: "このアプリケーションは位置情報サービスを使用できません", message: "「このアプリは、位置情報を取得できないために、正常に動作できません」", preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "OK", style: .default))
            // 「このアプリは、位置情報を取得できないために、正常に動作できません」を表示する
            break
        case .authorizedAlways:
            print("常時、位置情報の取得が許可されています。")
            // 位置情報取得の開始処理
            break
        case .authorizedWhenInUse:
            print("起動時のみ、位置情報の取得が許可されています。")
            // 位置情報取得の開始処理
            break
        }
    }
}


よろしくお願いいたします。

書き忘れましたが、
GoogleMobileAds.framework
を使っています。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/10/02 10:01

    viewWillTransitionの中のswitch分で正しく分岐出来ていないのでしょうか?それともデバイスサイズが正しく取得できていないのでしょうか?

    キャンセル

  • harima

    2017/10/02 13:44

    switch文の分岐もデバイスサイズの取得もできております。Hardware -> Rotate Right を実行すると一瞬バナーが見えて、遠くに離れていくように見えます。

    キャンセル

回答 1

0

GADBannerViewの代わりにUIViewで試しましたが、正しく画面下に表示されましたので、GADBannerViewの問題のような気がするのですが、どうでしょうか?
iOS11、Xcode9などに対応しているか確認して下さい。

あと質問とは関係ないですが、.landscapeRight "左が上"だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Swift

    7625questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

  • Xcode

    4302questions

    Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

  • iOS

    4150questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

  • iPhone

    1015questions

    iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。