The UINavigationBar is in the UIPresentationController’s containerView, which is a subview of the current UIWindow and does NOT have a view controller in its hierarchy. Is there a particular reason for UINavigationBar to have this dependency for correct layout? Is there a ‘right’ way to work around this aside from manual/artificial padding?
Dan On Dec 7, 2016, at 10:01 AM, David Duncan <david.dun...@apple.com<mailto:david.dun...@apple.com>> wrote: 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 <dstenm...@opentable.com<mailto:dstenm...@opentable.com>> 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 (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/david.duncan%40apple.com This email sent to david.dun...@apple.com<mailto:david.dun...@apple.com> -- David Duncan _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) 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: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com