Re: UINavigationBar content margins in UIPresentationController subclass
Re: UINavigationBar content margins in UIPresentationController subclass
- Subject: Re: UINavigationBar content margins in UIPresentationController subclass
- From: David Duncan <email@hidden>
- Date: Wed, 07 Dec 2016 10:01:49 -0800
Its unclear to me at least, but where in the view hierarchy is the UINavigationBar? If it isn’t in a view that is ultimately backed by a view controller, then it won’t have the correct information to do its layout.
> On Nov 7, 2016, at 12:42 PM, Daniel Stenmark <email@hidden> wrote:
>
> I have a UIPresentationController subclass with a UINavigationBar embedded in the container view. However, when setting the rightBarButtonItem, the spacing I usually expect from the item to the screen isn't there.
>
> http://imgur.com/LHcqhyd<http://imgur.com/a/610al>
>
> Anyone have an idea where I might be going wrong here? The relevant code for the presentation controller is as follows:
>
> @objc public protocol SheetPresentationControllerDelegate : class {
> func sheetPresentationControllerWillDismiss(_ sheetPresentationController: SheetPresentationController)
> }
>
> open class SheetPresentationController: UIPresentationController {
>
>
>
> fileprivate let dimmedView: UIView = {
> let result = UIView()
> result.backgroundColor = .black
> result.alpha = 0
> result.autoresizingMask = [.flexibleWidth, .flexibleHeight]
> return result
> }()
>
>
>
> fileprivate let topView: UIView = {
> let result = UIView()
> result.backgroundColor = .white
> return result
> }()
>
>
>
> fileprivate let navigationBar: UINavigationBar = {
> let result = UINavigationBar()
> result.backgroundColor = .white
> result.items = [UINavigationItem()]
> return result
> }()
>
>
>
> open var title: String? {
> get {
> return self.navigationBar.topItem?.title
> }
> set {
> self.navigationBar.topItem?.title = newValue
> }
> }
>
>
>
> open var titleView: UIView? {
> get {
> return self.navigationBar.topItem?.titleView
> }
> set {
> self.navigationBar.topItem?.titleView = newValue
> }
> }
>
>
>
> open weak var sheetDelegate: SheetPresentationControllerDelegate?
>
>
>
> fileprivate dynamic func dismiss(_ sender: NSObject) {
> self.presentingViewController.dismiss(animated: true, completion: nil)
> }
>
>
>
> override open func presentationTransitionWillBegin() {
> super.presentationTransitionWillBegin()
>
>
>
> guard let containerView = self.containerView else {
> return
> }
>
>
>
> containerView.addSubview(self.dimmedView)
> self.dimmedView.frame = CGRect(origin: .zero, size: containerView.bounds.size)
>
>
>
> let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismiss))
> self.dimmedView.addGestureRecognizer(gestureRecognizer)
>
>
>
> self.presentedViewController.transitionCoordinator?.animate( alongsideTransition: { (context) in
> self.dimmedView.alpha = 0.5
>
>
>
> }, completion: nil)
>
>
>
> containerView.addSubview(self.topView)
> containerView.addSubview(self.navigationBar)
>
>
>
> self.navigationBar.topItem?.rightBarButtonItems = [UIBarButtonItem(title: NSLocalizedString("Done", comment: ""), style: .done, target: self, action: #selector(dismiss))]
> }
>
>
>
> override open func dismissalTransitionWillBegin() {
> super.dismissalTransitionWillBegin()
>
>
>
> self.sheetDelegate?.sheetPresentationControllerWillDismiss(self)
>
>
>
> self.presentedViewController.transitionCoordinator?.animate( alongsideTransition: { (context) in
> self.dimmedView.alpha = 0
>
>
>
> }, completion: nil)
> }
>
>
>
> override open var frameOfPresentedViewInContainerView : CGRect {
> return CGRect(x: 0, y: self.navigationBar.frame.origin.y + self.navigationBar.intrinsicContentSize.height, width: self.containerView?.bounds.width ?? 0, height: self.presentedViewController.preferredContentSize.height)
> }
>
>
>
> override open func containerViewWillLayoutSubviews() {
> super.containerViewWillLayoutSubviews()
>
>
>
> self.topView.frame = CGRect(x: 0, y: 0, width: self.containerView?.bounds.width ?? 0, height: self.presentingViewController.topLayoutGuide.length)
> self.navigationBar.frame = CGRect(x: 0, y: self.topView.frame.origin.y + self.topView.bounds.height, width: self.containerView?.bounds.width ?? 0, height: self.navigationBar.intrinsicContentSize.height)
>
>
>
> self.presentedView?.frame = self.frameOfPresentedViewInContainerView
> }
> }
>
> Dan
> _______________________________________________
>
> Cocoa-dev mailing list (email@hidden)
>
> Please do not post admin requests or moderator comments to the list.
> Contact the moderators at cocoa-dev-admins(at)lists.apple.com
>
> Help/Unsubscribe/Update your Subscription:
>
> This email sent to email@hidden
--
David Duncan
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden