如何更改导航栏下方的边框颜色?

时间:2011-07-25 10:58:29

标签: iphone objective-c ios uinavigationbar border

有人可以告诉我如何更改导航栏下方的边框吗?

enter image description here

我想将它从当前的黑光改为更柔和的颜色。 感谢这里的任何帮助

6 个答案:

答案 0 :(得分:42)

我认为除了tintColor的{​​{1}}属性之外,还有一种方法可以更改导航颜色的边框颜色。

我建议您创建一个边框大小的UIView,并将其放在导航栏下方/将其添加为UINavigationBar

subView

答案 1 :(得分:9)

在Swift中像@Legolas一样回答:

if let navigationController = self.navigationController {

   let navigationBar = navigationController.navigationBar     
   let navBorder: UIView = UIView(frame: CGRectMake(0, navigationBar.frame.size.height - 1, navigationBar.frame.size.width, 1))
   // Set the color you want here
   navBorder.backgroundColor = UIColor(red: 0.19, green: 0.19, blue: 0.2, alpha: 1)
   navBorder.opaque = true
   self.navigationController?.navigationBar.addSubview(navBorder)
}

您可以加入viewDidLoad()的{​​{1}}。

答案 2 :(得分:4)

对于iOS 7,你可以使用它:

[self.navigationController.navigationBar setShadowImage:[UIImage new]];

答案 3 :(得分:2)

您还可以将子视图添加到导航栏

以下代码将在导航栏下方添加4像素深蓝色边框

UINavigationBar* navBar = self.navigationController.navigationBar;
    int borderSize = 4;
    UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navBar.frame.size.height-borderSize,navBar.frame.size.width, borderSize)];
    [navBorder setBackgroundColor:[UIColor blueColor]];
    [self.navigationController.navigationBar addSubview:navBorder];

答案 4 :(得分:1)

我在之前的答案中发现了几个问题:

  • 如果您添加子视图:在设备旋转时,边框将不再具有正确的框架
  • 如果将shadowImage设置为nil,则无法自定义navigationBar的阴影。

解决这个问题的一种方法是使用autolayout:

extension UINavigationBar {

  func setBottomBorderColor(color: UIColor, height: CGFloat) -> UIView {
    let bottomBorderView = UIView(frame: CGRectZero)
    bottomBorderView.translatesAutoresizingMaskIntoConstraints = false
    bottomBorderView.backgroundColor = color

    self.addSubview(bottomBorderView)

    let views = ["border": bottomBorderView]
    self.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[border]|", options: [], metrics: nil, views: views))
    self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: height))
    self.addConstraint(NSLayoutConstraint(item: bottomBorderView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1.0, constant: height))

    return bottomBorderView
  }
}

我返回边框的原因是在旋转过程中你会在navigation bar的中间看到它,所以我在旋转过程中隐藏它。

答案 5 :(得分:-1)

尽管navigationBar是UINavigationController的只读属性,但您可以避免 这个限制是“setValue:forKey:”。该方法已获得成功提交至AppStore的5个申请的批准。

您可以根据需要继承UINavigationBar并更改drawRect:方法。 例如,

@implementation CustomNavigationBar

- (void) drawRect:(CGRect)rect
{
    [super drawRect:rect];
    UIImage *backgroundImage = ImageFromColor(WANTED_COLOR);
    [backgroundImage drawInRect:rect];
}

您可以继承UINavigationController并更改initWithRootViewController:

- (id) initWithRootViewController:(UIViewController *)rootViewController
{
    self = [super initWithRootViewController:rootViewController]; 
    if (self) 
    {
        CustomNavigationBar *navBar = [CustomNavigationBar new];
        [self setValue:navBar forKey:@"navigationBar"];
    }
    return self;
}

此外,您可以通过为UINavigationController创建Category并为initWithRootViewController实现方法调整来改变这种方法:

P.S。昨天我的新应用程序出现在AppStore,没有任何问题。