Help with changing the height of a UIView based on the device

I am trying to change the height of a UIView based on which device the user is on. For example, I have created a view with an alpha of 25%. This view is pinned to the top, left, and right of the screen. I need the view to have a height of 44 when viewed on devices that have the cutout at the top (i.e. iPhone 11...etc.) and a height of 22 when viewed on devices that do not have the cutout (i.e. iPhone 8s Plus..etc.).


I am trying to accomplish this by using Vary for Traits in Xcode and not successful (I am sure it's because that is the wrong way to do it. LOL).

Please let me know if you need additional information or have any questions. I appreciate your time and help in advance.


Thank you,

mz

Accepted Reply

I don't understand either.

Most likeley, UIApplication.shared.delegate?.window. is nil

Could you check if UIApplication.shared.delegate is nil or not ?


Does the AppDelegate class contains this :


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


Are you running on simulator or device ?


I tested with 13.2 target, still works.


I may have found the difference.

Tested on a project with SceneDelegate.


And then, notch is false, even on X11 Pro.


So, I replaced by this extension:

extension UIDevice {
    var hasNotch: Bool {
        if #available(iOS 11.0, *) {
            if UIApplication.shared.windows.count == 0 { return false }          // Should never occur, but…
            let top = UIApplication.shared.windows[0].safeAreaInsets.top
            return top > 20          // That seem to be the minimum top when no notch…
        } else {
            // Fallback on earlier versions
            return false
        }
    }
}

Credit:

h ttps://www.reddit.com/r/swift/comments/cap2r4/how_to_access_uiwindow_from_scenedelegate_in_ios/


That seems to work.

Replies

Thank you, Claude31. I saw this code from earlier. Not, sure how to make it work where the extension is used again when the device is rotated. My code works up to the point where it does not check for device notch as the device is rotated from portrait to landscape and back to portrait. The hasNotch Bool is only checked once the view is loaded. How do I get the Bool to check again when the view is rotated?


mz

You could call it inside


    override func viewWillLayoutSubviews() {
     }