0

导航栏上的冲突,我需要添加边框的下方UIInavigationBar,我也希望它是全球性的东西,所以我去我顶层次UIViewController,并把那里的方法类同这一个:添加子层与过渡

- (void)setupNavigationBarBorder { 
    if (![self isKindOfClass:[CombinedViewController class]]) { 
     CGRect borderRect = CGRectMake(0, self.navigationController.navigationBar.frame.size.height-0.5f, self.navigationController.navigationBar.frame.size.width, 0.5f); 
     CALayer *border = [CALayer layer]; 
     border.frame = borderRect; 
     border.name = @"border"; 
     [border setBackgroundColor:[UIColor greenColor].CGColor]; 
     [self.navigationController.navigationBar.layer addSublayer:border]; 
    } else { 
     NSArray* sublayers = [NSArray arrayWithArray:self.navigationController.navigationBar.layer.sublayers]; 
     for (CALayer *layer in sublayers) { 
      if ([layer.name isEqualToString:@"border"]) { 
       [layer removeFromSuperlayer]; 
      } 
     } 
    } 
} 

这是一个简单的触发器用于绘制和删除此子图层。非常简单。所以起初我已经决定我将这个代码放在viewDidLoad,但事实证明这不是最好的主意,因为我实际上修改了UINavigationBar的全局状态。下一步是把这个方法调用到viewWillAppear和大多数时候它是好的,但是当我从这个ComboFeedViewController移动到应该有这个边界的那个......好吧,它会立即得到。

我希望在转换结束时或在最佳情况下显示转换时显示。我怎样才能做到这一点?

回答

2

请查看Apple的Customizing UINavigationBar示例代码。该例子在定制导航栏方面涵盖了很多方面。

如果你想直观地修改导航栏,但只有该修改在导航堆栈中的屏幕之一可见,那么最好的办法是挂接到这两种方法:

  • viewWillAppear:为在酒吧
  • viewWillDisappear:修改的东西隐藏该修改

的didAppear或didDisappear方法也可以为你工作。但我发现挂钩willAppear/willDisappear变种和尊重动画参数为我创造奇迹。

下面是从我的一个隐藏导航栏下方的细线(边框)的项目中取出的示例代码(如果您想在UINavigationBar的下方粘贴UIToolbar,可以使用双大小的条):

class ViewController: UIViewController { 
    override func viewWillAppear(animated: Bool) { 
     super.viewWillAppear(animated) 

     // We need to hide the hairline, so the bar appears 
     // continous with the toolbar below it. 
     navigationController?.navigationBar.setHairlineEnabled(false, animated: animated) 
    } 

    override func viewWillDisappear(animated: Bool) { 
     super.viewWillDisappear(animated) 

     navigationController?.navigationBar.setHairlineEnabled(true, animated: animated) 
    } 
} 

extension UINavigationBar { 
    /// Hides the hairline below the navigation bar by walking 
    /// the subview hierarchy and finding a 0.5 or 1 pt tall view. 
    func setHairlineEnabled(enabled: Bool, animated: Bool) { 
     guard subviews.count > 0 else { return } 

     let firstSubview = subviews[0] 

     for subview in firstSubview.subviews { 
      let height = subview.bounds.height 

      if height == CGFloat(0.5) || height == CGFloat(1.0) { 
       let work = { 
        subview.alpha = enabled ? CGFloat(1) : CGFloat(0) 
       } 

       if animated { 
        UIView.animateWithDuration(NSTimeInterval(UINavigationControllerHideShowBarDuration), animations: { 
         work() 
        }) 
       } else { 
        work() 
       } 

       break 
      } 
     } 
    } 
} 
0

虽然批准答案似乎解决我的问题,我面临一些问题从我的应用程序的具体意见转变。主要是因为viewVillAppear是在轻扫手势开始时立即触发的。

的缺陷是如此之小,这是不值得在花费时间的巨大数额,但它仍然是地方在我的头上,所以...我发现了一个名为库KMNavigationBarTransition碎冰鸡尾酒方法,因此,您可以为每个视图控制器设置不同的导航栏外观 - 这正是我所期待的。

现在我可以简单地将我的showBorderhideBorder cusstom方法放在特定视图控制器的viewDidLoad中,一切都完美无缺!