Programmatically defining the height of a notification content extension

3.1k Views Asked by At

The width:height ratio of a notification extension can be defined through attribute UNNotificationExtensionInitialContentSizeRatio in the extension's Info.plist file. But can this value somehow be changed after the respective UIViewController is loaded?

The documentation on Apple's site indicates that it is indeed possible:

You can change the size of your view controller after your extension loads.

But how? I've tried changing the extension's main UIView's frame, like so...

func didReceive(_ notification: UNNotification) {

    self.view.frame = CGRect(x: 0.0, y: 0.0, width: self.view.frame.width, height: 100.0)
    self.view.setNeedsUpdateConstraints()
    self.view.setNeedsLayout()
}

...but only the view's frame is correctly updated, leaving the whole notification container with an empty white area at the bottom.

I've also attempted some less obvious solutions, including changing the frame at different points in the controller's lifecycle and setting the UIWindow's frame directly. None were successful so far.

Any idea if the height can be changed programmatically?

Thank you in advance for any answer.

3

There are 3 best solutions below

3
On BEST ANSWER

You can override the size by using the preferredContentSize property of UIViewController.

0
On
 func didReceive(_ notification: UNNotification) {

    self.preferredContentSize = CGSize(width: UIScreen.main.bounds.size.width, height: 200)
    self.view.setNeedsUpdateConstraints()
    self.view.setNeedsLayout() 
  // Image downloading work or other logic
}
0
On

If you properly setup auto layout for all controls, the notification will resize itself correctly. There is no need to call any resize code.