How to create a short modal overlay like the iOS Share Sheet menu?
up vote
-2
down vote
favorite
I’m trying to create a custom, short menu that slides up from the bottom of the screen and stays at the bottom (like the iOS share sheet). I’m having a hard time trying to figure out how to do it. I tried presenting a view controller as a modal and setting the preferred content size, but it still presents it as full screen. How can I present a short, modal-like overlay?
ios objective-c swift
add a comment |
up vote
-2
down vote
favorite
I’m trying to create a custom, short menu that slides up from the bottom of the screen and stays at the bottom (like the iOS share sheet). I’m having a hard time trying to figure out how to do it. I tried presenting a view controller as a modal and setting the preferred content size, but it still presents it as full screen. How can I present a short, modal-like overlay?
ios objective-c swift
add a comment |
up vote
-2
down vote
favorite
up vote
-2
down vote
favorite
I’m trying to create a custom, short menu that slides up from the bottom of the screen and stays at the bottom (like the iOS share sheet). I’m having a hard time trying to figure out how to do it. I tried presenting a view controller as a modal and setting the preferred content size, but it still presents it as full screen. How can I present a short, modal-like overlay?
ios objective-c swift
I’m trying to create a custom, short menu that slides up from the bottom of the screen and stays at the bottom (like the iOS share sheet). I’m having a hard time trying to figure out how to do it. I tried presenting a view controller as a modal and setting the preferred content size, but it still presents it as full screen. How can I present a short, modal-like overlay?
ios objective-c swift
ios objective-c swift
asked Nov 9 at 6:10
Andrew
95.7k158456640
95.7k158456640
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
accepted
You could use a UIPresentationController and a UIViewControllerTransitioningDelegate.
As a starting point here a few lines of code:
UIViewControllerTransitioningDelegate
class OverlayTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
return OverlayPresentationController(presentedViewController:presented, presenting:presenting)
UIPresentationController
class OverlayPresentationController: UIPresentationController
private let dimmedBackgroundView = UIView()
private let height: CGFloat = 200.0
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?)
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
self.dimmedBackgroundView.addGestureRecognizer(tapGestureRecognizer)
override var frameOfPresentedViewInContainerView: CGRect
var frame = CGRect.zero
if let containerBounds = containerView?.bounds
frame = CGRect(x: 0,
y: containerBounds.height - height,
width: containerBounds.width,
height: height)
return frame
override func presentationTransitionWillBegin()
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: _ in
self.dimmedBackgroundView.alpha = 0.5
, completion: nil)
override func dismissalTransitionDidEnd(_ completed: Bool)
self.dimmedBackgroundView.removeFromSuperview()
@objc private func backgroundTapped()
self.presentedViewController.dismiss(animated: true, completion: nil)
How to call it
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
@IBAction func onOpenModalOverlay(_ sender: Any)
let overlayVC = OverlayViewController()
overlayVC.transitioningDelegate = self.overlayTransitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
Demo
The OverlayViewController is a normal ViewController. Here I used an ugly green background color to make it easier to recognize the overlay.

add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
accepted
You could use a UIPresentationController and a UIViewControllerTransitioningDelegate.
As a starting point here a few lines of code:
UIViewControllerTransitioningDelegate
class OverlayTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
return OverlayPresentationController(presentedViewController:presented, presenting:presenting)
UIPresentationController
class OverlayPresentationController: UIPresentationController
private let dimmedBackgroundView = UIView()
private let height: CGFloat = 200.0
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?)
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
self.dimmedBackgroundView.addGestureRecognizer(tapGestureRecognizer)
override var frameOfPresentedViewInContainerView: CGRect
var frame = CGRect.zero
if let containerBounds = containerView?.bounds
frame = CGRect(x: 0,
y: containerBounds.height - height,
width: containerBounds.width,
height: height)
return frame
override func presentationTransitionWillBegin()
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: _ in
self.dimmedBackgroundView.alpha = 0.5
, completion: nil)
override func dismissalTransitionDidEnd(_ completed: Bool)
self.dimmedBackgroundView.removeFromSuperview()
@objc private func backgroundTapped()
self.presentedViewController.dismiss(animated: true, completion: nil)
How to call it
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
@IBAction func onOpenModalOverlay(_ sender: Any)
let overlayVC = OverlayViewController()
overlayVC.transitioningDelegate = self.overlayTransitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
Demo
The OverlayViewController is a normal ViewController. Here I used an ugly green background color to make it easier to recognize the overlay.

add a comment |
up vote
0
down vote
accepted
You could use a UIPresentationController and a UIViewControllerTransitioningDelegate.
As a starting point here a few lines of code:
UIViewControllerTransitioningDelegate
class OverlayTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
return OverlayPresentationController(presentedViewController:presented, presenting:presenting)
UIPresentationController
class OverlayPresentationController: UIPresentationController
private let dimmedBackgroundView = UIView()
private let height: CGFloat = 200.0
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?)
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
self.dimmedBackgroundView.addGestureRecognizer(tapGestureRecognizer)
override var frameOfPresentedViewInContainerView: CGRect
var frame = CGRect.zero
if let containerBounds = containerView?.bounds
frame = CGRect(x: 0,
y: containerBounds.height - height,
width: containerBounds.width,
height: height)
return frame
override func presentationTransitionWillBegin()
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: _ in
self.dimmedBackgroundView.alpha = 0.5
, completion: nil)
override func dismissalTransitionDidEnd(_ completed: Bool)
self.dimmedBackgroundView.removeFromSuperview()
@objc private func backgroundTapped()
self.presentedViewController.dismiss(animated: true, completion: nil)
How to call it
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
@IBAction func onOpenModalOverlay(_ sender: Any)
let overlayVC = OverlayViewController()
overlayVC.transitioningDelegate = self.overlayTransitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
Demo
The OverlayViewController is a normal ViewController. Here I used an ugly green background color to make it easier to recognize the overlay.

add a comment |
up vote
0
down vote
accepted
up vote
0
down vote
accepted
You could use a UIPresentationController and a UIViewControllerTransitioningDelegate.
As a starting point here a few lines of code:
UIViewControllerTransitioningDelegate
class OverlayTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
return OverlayPresentationController(presentedViewController:presented, presenting:presenting)
UIPresentationController
class OverlayPresentationController: UIPresentationController
private let dimmedBackgroundView = UIView()
private let height: CGFloat = 200.0
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?)
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
self.dimmedBackgroundView.addGestureRecognizer(tapGestureRecognizer)
override var frameOfPresentedViewInContainerView: CGRect
var frame = CGRect.zero
if let containerBounds = containerView?.bounds
frame = CGRect(x: 0,
y: containerBounds.height - height,
width: containerBounds.width,
height: height)
return frame
override func presentationTransitionWillBegin()
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: _ in
self.dimmedBackgroundView.alpha = 0.5
, completion: nil)
override func dismissalTransitionDidEnd(_ completed: Bool)
self.dimmedBackgroundView.removeFromSuperview()
@objc private func backgroundTapped()
self.presentedViewController.dismiss(animated: true, completion: nil)
How to call it
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
@IBAction func onOpenModalOverlay(_ sender: Any)
let overlayVC = OverlayViewController()
overlayVC.transitioningDelegate = self.overlayTransitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
Demo
The OverlayViewController is a normal ViewController. Here I used an ugly green background color to make it easier to recognize the overlay.

You could use a UIPresentationController and a UIViewControllerTransitioningDelegate.
As a starting point here a few lines of code:
UIViewControllerTransitioningDelegate
class OverlayTransitioningDelegate: NSObject, UIViewControllerTransitioningDelegate
func presentationController(forPresented presented: UIViewController, presenting: UIViewController?, source: UIViewController) -> UIPresentationController?
return OverlayPresentationController(presentedViewController:presented, presenting:presenting)
UIPresentationController
class OverlayPresentationController: UIPresentationController
private let dimmedBackgroundView = UIView()
private let height: CGFloat = 200.0
override init(presentedViewController: UIViewController, presenting presentingViewController: UIViewController?)
super.init(presentedViewController: presentedViewController, presenting: presentingViewController)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(backgroundTapped))
self.dimmedBackgroundView.addGestureRecognizer(tapGestureRecognizer)
override var frameOfPresentedViewInContainerView: CGRect
var frame = CGRect.zero
if let containerBounds = containerView?.bounds
frame = CGRect(x: 0,
y: containerBounds.height - height,
width: containerBounds.width,
height: height)
return frame
override func presentationTransitionWillBegin()
if let containerView = self.containerView, let coordinator = presentingViewController.transitionCoordinator
containerView.addSubview(self.dimmedBackgroundView)
self.dimmedBackgroundView.backgroundColor = .black
self.dimmedBackgroundView.frame = containerView.bounds
self.dimmedBackgroundView.alpha = 0
coordinator.animate(alongsideTransition: _ in
self.dimmedBackgroundView.alpha = 0.5
, completion: nil)
override func dismissalTransitionDidEnd(_ completed: Bool)
self.dimmedBackgroundView.removeFromSuperview()
@objc private func backgroundTapped()
self.presentedViewController.dismiss(animated: true, completion: nil)
How to call it
let overlayTransitioningDelegate = OverlayTransitioningDelegate()
@IBAction func onOpenModalOverlay(_ sender: Any)
let overlayVC = OverlayViewController()
overlayVC.transitioningDelegate = self.overlayTransitioningDelegate
overlayVC.modalPresentationStyle = .custom
self.present(overlayVC, animated: true, completion: nil)
Demo
The OverlayViewController is a normal ViewController. Here I used an ugly green background color to make it easier to recognize the overlay.

answered Nov 9 at 22:06
Stephan Schlecht
2,460188
2,460188
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53220682%2fhow-to-create-a-short-modal-overlay-like-the-ios-share-sheet-menu%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown