> On Dec 7, 2016, at 10:28 AM, Daniel Stenmark <dstenm...@opentable.com> wrote:
> 
> 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?

Only view controllers know the proper calculation for the padding to be used by 
the bars. Typically a solution to your issue would be to wrap the presenting 
view controller in a UINavigationController rather than making the navigation 
bar part of the presentation itself.

> 
> 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> 
>>> <http://imgur.com/LHcqhyd%3Chttp://imgur.com/a/610al%3E>
>>> 
>>> 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 
>>> <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
> 

--
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

Reply via email to