Как изменить цвет рамки под панелью навигации? - PullRequest
15 голосов
/ 25 июля 2011

Может кто-нибудь посоветовать мне, как можно изменить границу под панелью навигации?

enter image description here

Я бы хотел изменить его с текущего черного света на более мягкий цвет. Цените любую помощь здесь

Ответы [ 6 ]

42 голосов
/ 25 июля 2011

Я не думаю, что есть метод для изменения цвета границы цвета навигации, кроме свойства tintColor UINavigationBar.

Я бы посоветовал вам создать UIView с таким размером рамки и поместить его под панель навигации / добавить как subView.

UIView *navBorder = [[UIView alloc] initWithFrame:CGRectMake(0,navigationBar.frame.size.height-1,navigationBar.frame.size.width, 1)]; 

// Change the frame size to suit yours //

[navBorder setBackgroundColor:[UIColor colorWithWhite:200.0f/255.f alpha:0.8f]];
[navBorder setOpaque:YES];
[navigationBar addSubview:navBorder];
[navBorder release];
9 голосов
/ 17 июня 2015

В 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() вашего UIViewController.

4 голосов
/ 26 сентября 2013

Для iOS 7 вы можете использовать это:

[self.navigationController.navigationBar setShadowImage:[UIImage new]];
2 голосов
/ 29 октября 2012

Вы также можете добавить дочерний вид на панель навигации

Следующий код добавит синюю рамку 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];
1 голос
/ 01 августа 2016

Я нашел пару вопросов с предыдущими ответами:

  • если вы добавите подпредставление: после поворота устройства граница больше не будет иметь правильную рамку
  • если вы установите для shadowImage значение nil, вы не сможете настроить тень панели навигации.

Один из способов решить эту проблему - использовать 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, поэтому я скрываю ее во время вращения.

0 голосов
/ 15 сентября 2013

Несмотря на то, что navigationBar - это свойство только для чтения для UINavigationController, вы можете избежать это ограничение "setValue: forKey:". Этот метод был одобрен для 5 приложений, успешно отправленных в AppStore.

Вы можете создать подкласс 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 и реализовав метод swizzling для initWithRootViewController:

P.S. Вчера мое новое приложение появилось в AppStore без каких-либо проблем с этим подходом.

...