导航栏后面的search栏

给定3个控制器:A,B,C A有一个隐藏的导航栏。 通过StoryboardReference调用控制器B. 控制器B在viewDidLoad上显示导航栏。 它有一个search栏和一个collectionView。 看到我的故事板截图A. 调用控制器C如果一个单元格被点击。

问题:如果A调用B,则search栏位于导航栏后面(屏幕截图B)。 它从C到B的转换(截图C)出现。

导航栏已经是半透明的了。 有任何想法吗?

编辑

我意识到,我的animation过渡正在造成我的问题。

也许你可以发现错误?

class ZoomInCircleViewTransition: NSObject, UIViewControllerAnimatedTransitioning, UIViewControllerTransitioningDelegate { var transitionContext: UIViewControllerContextTransitioning? func transitionDuration(transitionContext: UIViewControllerContextTransitioning?) -> NSTimeInterval { return 0.6 } func animateTransition(transitionContext: UIViewControllerContextTransitioning) { self.transitionContext = transitionContext guard let toViewController: UIViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) else { return } guard let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) else { return } guard let fromViewTransitionFromView = fromViewController as? TransitionFromViewProtocol else { return } let imageViewSnapshot = fromViewTransitionFromView.getViewForTransition() let endFrame = CGRectMake(-CGRectGetWidth(toViewController.view.frame)/2, -CGRectGetHeight(toViewController.view.frame)/2, CGRectGetWidth(toViewController.view.frame)*2, CGRectGetHeight(toViewController.view.frame)*2) if let containerView = transitionContext.containerView(){ containerView.addSubview(fromViewController.view) containerView.addSubview(toViewController.view) containerView.addSubview(imageViewSnapshot) } let maskPath = UIBezierPath(ovalInRect: imageViewSnapshot.frame) let maskLayer = CAShapeLayer() maskLayer.frame = toViewController.view.frame maskLayer.path = maskPath.CGPath toViewController.view.layer.mask = maskLayer let quadraticEndFrame = CGRect(x: endFrame.origin.x - (endFrame.height - endFrame.width)/2, y: endFrame.origin.y, width: endFrame.height, height: endFrame.height) let bigCirclePath = UIBezierPath(ovalInRect: quadraticEndFrame) let pathAnimation = CABasicAnimation(keyPath: "path") pathAnimation.delegate = self pathAnimation.fromValue = maskPath.CGPath pathAnimation.toValue = bigCirclePath pathAnimation.duration = transitionDuration(transitionContext) maskLayer.path = bigCirclePath.CGPath maskLayer.addAnimation(pathAnimation, forKey: "pathAnimation") let hideImageViewAnimation = { imageViewSnapshot.alpha = 0.0 } UIView.animateWithDuration(0.2, delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: hideImageViewAnimation) { (completed) -> Void in } let scaleImageViewAnimation = { imageViewSnapshot.frame = quadraticEndFrame } UIView.animateWithDuration(transitionDuration(transitionContext), delay: 0.0, options: UIViewAnimationOptions.CurveLinear, animations: scaleImageViewAnimation) { (completed) -> Void in // After the complete animations have endet imageViewSnapshot.removeFromSuperview() toViewController.view.layer.mask = nil } } override func animationDidStop(anim: CAAnimation, finished flag: Bool) { if let transitionContext = self.transitionContext { transitionContext.completeTransition(!transitionContext.transitionWasCancelled()) } } // MARK: UIViewControllerTransitioningDelegate protocol methods // return the animataor when presenting a viewcontroller func animationControllerForPresentedController(presented: UIViewController, presentingController presenting: UIViewController, sourceController source: UIViewController) -> UIViewControllerAnimatedTransitioning? { return self } // return the animator used when dismissing from a viewcontroller func animationControllerForDismissedController(dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? { return self } } 

我相信我在我的应用程序中遇到了一些类似的问题,但由于所有你无法控制的事情而陷入困境。 我的解决scheme是在导航栏中放置一个search图标,然后让search控制器在导航栏上向下滑动,使其不在表格/滚动视图中。 这是我的实现(应该是完整的)

 import UIKit class tvc: UITableViewController, UISearchBarDelegate, UISearchControllerDelegate { var searchController:UISearchController! @IBAction func startSearch() { self.navigationController?.presentViewController(self.searchController, animated: true, completion: {}) } override func viewDidDisappear(animated: Bool) { cancelSearch(self) } override func viewDidLoad() { super.viewDidLoad() searchController = UISearchController(searchResultsController: nil) searchController.searchResultsUpdater = self searchController.dimsBackgroundDuringPresentation = false searchController.delegate = self searchController.hidesNavigationBarDuringPresentation = false searchController.loadViewIfNeeded() /* Fixes bug in iOS http://stackoverflow.com/questions/32675001/uisearchcontroller-warning-attempting-to-load-the-view-of-a-view-controller */ definesPresentationContext = true tableView.sectionIndexBackgroundColor = UIColor.clearColor() tableView.sectionIndexTrackingBackgroundColor = UIColor.clearColor() } 

 extension tvc: UISearchResultsUpdating { // MARK: - UISearchResultsUpdating Delegate func updateSearchResultsForSearchController(searchController: UISearchController) { filterContentForSearchText(searchController.searchBar.text!) } } 

 func cancelSearch(sender: AnyObject?) { if sender!.searchController.active == true { sender?.searchController.resignFirstResponder() sender!.navigationController!!.dismissViewControllerAnimated(false, completion: {}) sender!.searchController.searchBar.text = "" sender!.searchController.active = false } } 

我认为问题是你要么不是为imageViewSnapshot设置框架,要么设置错误的框架。 由于imageViewSnapshot包含search栏,因此您必须设置框架,使其位于导航栏的后面。 或imageViewSnapshot应该只包含fromViewTransitionFromView的可见区域。