Search code examples
swiftswiftuiuiviewcontrolleradmob

How to change the frame of a UIViewController in Swift


I am currently integrating a UIViewController with UIViewControllerRepresentable into my SwiftUI project and would now like to change the frame of the UIViewController. For that I used this code:

let vc = UIViewController()
vc.view.frame.size = CGSize(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)

However, when I integrate the view created by UIViewControllerRepresentable into my SwiftUI project in a VStack with a list, the UIViewController does not have the size I want. Look at this

My hole code is:

func makeUIViewController(context: Context) -> UIViewController {
    let vc = UIViewController()
    vc.view.frame.size = CGSize(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height)
    vc.view.backgroundColor = .gray
    vc.view.alpha = 0
    
    let bannerView = GADBannerView(adSize: kGADAdSizeBanner)
    bannerView.adUnitID = "ca-app-pub-3940256099942544/2934735716"
    bannerView.alpha = 0
    bannerView.rootViewController = vc
    bannerView.delegate = context.coordinator
    bannerView.load(GADRequest())

    vc.view.addSubview(bannerView)
    
    return vc
}

kGADSizeBanner is a size variable from Google for the ad.

Also, I was wondering why my ad isn't appearing in the center of the gray UIViewController. Can someone help out?

What I tried so far:

  1. vc.view.translatesAutoresizingMaskIntoConstraints = false
  2. vc.view.frame = CGRect(origin: .zero, size: CGSize(width: kGADAdSizeBanner.size.width, height: kGADAdSizeBanner.size.height))

Solution

  • Override sizeThatFits in your UIViewControllerRepresentable implementation.

    For a fixed size, just return the CGSize you want, but you can also try experimenting with taking the proposal into account.

    func sizeThatFits(_ proposal: ProposedViewSize, uiViewController: UIViewController, context: Context) -> CGSize? {
        kGADAdSizeBanner.size
    }
    

    The banner is not at the centre of the view controller, because it is at (0, 0), a typical default location for a view that you didn't set a position explicitly or added any constraints.