Как скрыть нижнюю строку UINavigationBar 1px

374

У меня есть приложение, для которого иногда требуется панель навигации, чтобы вписаться в контент.

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

На изображении ниже ситуации у меня есть - я говорю об этой строке высоты 1px ниже "Root View Controller"

Изображение 52

  • 0
    Просмотрите это: stackoverflow.com/questions/19101361/…
  • 0
    как увеличить 1px высоты навигации?
Теги:
uinavigationbar
ipad

41 ответ

652
Лучший ответ

Чтобы сделать это, вы должны установить собственное теневое изображение. Но для показа теневого изображения вам также нужно установить пользовательское фоновое изображение, цитату из документации Apple:

Для отображения пользовательского теневого изображения пользовательское фоновое изображение должно также устанавливается с помощью метода setBackgroundImage (_: for:). Если значение по умолчанию используется фоновое изображение, тогда используется теневое изображение по умолчанию независимо от значения этого свойства.

Итак:

let navigationBar = navigationController!.navigationBar
navigationBar.setBackgroundImage(#imageLiteral(resourceName: "BarBackground"),
                                                        for: .default)
navigationBar.shadowImage = UIImage()

Выше - единственный "официальный" способ скрыть это. К сожалению, он удаляет прозрачность штриха.

Я не хочу фоновое изображение, просто цвет

У вас есть следующие опции:

  • Твердый цвет, отсутствие прозрачности:

    navigationBar.barTintColor = UIColor.redColor()
    navigationBar.isTranslucent = false
    navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationBar.shadowImage = UIImage()
    
  • Создайте небольшое фоновое изображение, заполненное цветом, и используйте его.

  • Используйте метод "hacky", описанный ниже. Он также будет поддерживать прозрачность полосы.

Как сохранить прозрачный бар?

Чтобы обеспечить прозрачность, вам нужен другой подход, он выглядит как хак, но работает хорошо. Тень, которую мы пытаемся удалить, - это линия волос UIImageView где-то под UINavigationBar. Мы можем найти его и скрыть/показать его при необходимости.

Нижеприведенные инструкции предполагают, что вам нужна линия волос, скрытая только в одном контроллере вашей иерархии UINavigationController.

  • Объявить переменную экземпляра:

    private var shadowImageView: UIImageView?
    
  • Добавьте метод, который находит эту тень (волоса) UIImageView:

    private func findShadowImage(under view: UIView) -> UIImageView? {
        if view is UIImageView && view.bounds.size.height <= 1 {
            return (view as! UIImageView)
        }
    
        for subview in view.subviews {
            if let imageView = findShadowImage(under: subview) {
                return imageView
            }
        }
        return nil
    }
    
  • Добавить/изменить методы viewWillAppear/viewWillDisappear:

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        if shadowImageView == nil {
            shadowImageView = findShadowImage(under: navigationController!.navigationBar)
        }
        shadowImageView?.isHidden = true
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
    
        shadowImageView?.isHidden = false
    }
    

Тот же метод должен также работать для UISearchBar волоса, и (почти) все, что вам нужно, чтобы скрыть:)

Большое спасибо @Leo Natan за оригинальную идею!

  • 0
    Чтобы держать панель прозрачной, мне нужно было изменить view.bounds.size.height == 0,5 на view.bounds.size.height == 1.0, но в остальном все работало отлично. Благодарю.
  • 0
    Обновление моего предыдущего комментария: высота должна быть 0,5 для устройств с сетчаткой, но 1,0 для устройств без сетчатки. Я вижу, вы изменили свое состояние на <= 1.0, чтобы оно покрывало его.
Показать ещё 11 комментариев
158

Ниже может помочь просто!

Swift:

self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

Цель C:

[self.navigationController.navigationBar setValue:@(YES) forKeyPath:@"hidesShadow"];
  • 5
    Я на Xcode 8 и разработчик для> iOS 8, и ничего из вышеперечисленного не сработало для меня, кроме этого.
  • 2
    Также на XCode 8 и> iOS 8. Это единственный ответ, который работал для меня.
Показать ещё 18 комментариев
135

Если вы просто хотите использовать сплошной цвет панели навигации и настроили это в своем раскадровке, используйте этот код в своем классе AppDelegate, чтобы удалить границу с 1 пикселем через прокси-сервер вида:

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc] init]
                                  forBarPosition:UIBarPositionAny
                                      barMetrics:UIBarMetricsDefault];

[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
  • 2
    Это устанавливает его глобально для КАЖДОЙ панели навигации в вашей кодовой базе ... в большинстве случаев не то, что вы хотите.
  • 0
    У меня работает на iOS 11
Показать ещё 1 комментарий
93

Попробуйте следующее:

[[UINavigationBar appearance] setBackgroundImage: [UIImage new]  
                                   forBarMetrics: UIBarMetricsDefault];

[UINavigationBar appearance].shadowImage = [UIImage new];

Ниже приведено объяснение (iOS7 NavigationBar):

Изображение 1638

И проверьте этот вопрос: iOS7 - Изменить цвет границы UINavigationBar

  • 0
    Как сказал Сергей, для принятия теневого изображения необходимо установить пользовательское фоновое изображение.
  • 3
    сделать это в вашем AppDelegate.
Показать ещё 3 комментария
57

Быстрый способ сделать это:

UINavigationBar.appearance().setBackgroundImage(
    UIImage(),
    forBarPosition: .Any,
    barMetrics: .Default)

UINavigationBar.appearance().shadowImage = UIImage()
  • 2
    Это довольно редко, чтобы получить это далеко внизу списка, прежде чем найти самый гладкий ответ. +1!
  • 3
    Он скрывает весь фон UINavigationBar tho: /
Показать ещё 2 комментария
57

Хотел добавить версию ответа Сергея Свифта. Я создал UIBarExtension.swift со следующим:

import Foundation
import UIKit

extension UINavigationBar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIToolbar {
    func hideBottomHairline() {
        self.hairlineImageView?.isHidden = true
    }

    func showBottomHairline() {
        self.hairlineImageView?.isHidden = false
    }
}

extension UIView {
    fileprivate var hairlineImageView: UIImageView? {
        return hairlineImageView(in: self)
    }

    fileprivate func hairlineImageView(in view: UIView) -> UIImageView? {
        if let imageView = view as? UIImageView, imageView.bounds.height <= 1.0 {
            return imageView
        }

        for subview in view.subviews {
            if let imageView = self.hairlineImageView(in: subview) { return imageView }
        }

        return nil
    }
}
  • 0
    Спасибо! Этот должен быть ответом.
  • 0
    Он работает с навигационной панелью, но не работает с uitoolbar
Показать ещё 2 комментария
18

Простое решение в быстрой

   let navigationBar = self.navigationController?.navigationBar
    navigationBar?.setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    navigationBar?.shadowImage = UIImage()
  • 2
    +1 Из всех ответов это то, что в итоге сработало для меня. Он не испортил строку состояния, как другие ответы, и он решает проблему изменения только одной из панелей контроллера навигации, а не всех панелей навигации в проекте.
  • 0
    В моей ситуации это работает для iOS 12 и iOS 11.
16

После изучения ответа от Serhil я создал pod UINavigationBar + дополнение, который может скрыть прямую линию волос.

#import "UINavigationBar+Addition.h"

- (void)viewDidLoad {
    [super viewDidLoad];

    UINavigationBar *navigationBar = self.navigationController.navigationBar;
    [navigationBar hideBottomHairline];
}
12

В Swift 3.0

Отредактируйте ваш AppDelegate.swift, добавив следующий код в функцию вашего приложения:

// Override point for customization after application launch.

// Remove border in navigationBar
UINavigationBar.appearance().shadowImage = UIImage()
UINavigationBar.appearance().setBackgroundImage(UIImage(), for: .default)
11

pxpgraphics' решение обновлено для Swift 2.0

extension UINavigationBar {

    func hideBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = true
    }

    func showBottomHairline()
    {
        hairlineImageViewInNavigationBar(self)?.hidden = false
    }

    private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInNavigationBar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}

extension UIToolbar
{

    func hideHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = true
    }

    func showHairline()
    {
        let navigationBarImageView = hairlineImageViewInToolbar(self)?.hidden = false
    }

    private func hairlineImageViewInToolbar(view: UIView) -> UIImageView?
    {
        if let imageView = view as? UIImageView where imageView.bounds.height <= 1
        {
            return imageView
        }

        for subview: UIView in view.subviews
        {
            if let imageView = hairlineImageViewInToolbar(subview)
            {
                return imageView
            }
        }

        return nil
    }

}
  • 0
    Привет, новичок в iOS и пытаюсь учить себя. Как мне использовать расширение? У меня есть файл контроллера представления, и я помещаю эти расширения в него вне области видимости класса. Но тогда как мне вызвать hide / showHairline ()? Не совсем понимаю, как использовать расширения, но они используются для очень многих решений, но я просто не понимаю, как они реализованы в реальном коде
  • 0
    Расширения добавляют функциональность вашим существующим классам. Любой расширенный класс, структура, перечисление и т. Д. Будут иметь эти новые функции, доступные вам, когда вам нужно их использовать. Подробнее здесь: developer.apple.com/library/ios/documentation/Swift/Conceptual/…
Показать ещё 1 комментарий
9

Я использую расширение UINavigationBar, которое позволяет мне скрывать/показывать эту тень с помощью API UIAppearance или выбирать, какая панель навигации должна скрывать/показывать эту тень с помощью раскадровки (или исходного кода). Вот расширение:

import UIKit

private var flatAssociatedObjectKey: UInt8 = 0

/*
  An extension that adds a "flat" field to UINavigationBar. This flag, when
  enabled, removes the shadow under the navigation bar.
 */
@IBDesignable extension UINavigationBar {
    @IBInspectable var flat: Bool {
        get {
            guard let obj = objc_getAssociatedObject(self, &flatAssociatedObjectKey) as? NSNumber else {
                return false
            }
            return obj.boolValue;
        }

        set {
            if (newValue) {
                let void = UIImage()
                setBackgroundImage(void, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = void
            } else {
                setBackgroundImage(nil, forBarPosition: .Any, barMetrics: .Default)
                shadowImage = nil
            }
            objc_setAssociatedObject(self, &flatAssociatedObjectKey, NSNumber(bool: newValue),
                    objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
        }
    }
}

Теперь, чтобы отключить тень на всех навигационных панелях, вы должны использовать:

UINavigationBar.appearance().flat = true

Или вы можете включить/отключить это поведение с помощью раскадровки:

Изображение 1639

  • 0
    Что такое переменная flatKeyAssociatedObjectKey? XCode не распознает это ...
  • 0
    @ NunoGonçalves, вы можете думать о flatAssociatedObjectKey как об уникальном int (рассматриваемом как указатель) для идентификации вашего связанного объекта. Здесь определяется адрес памяти приватной переменной. Я обновил ответ, чтобы добавить эту вар. См. Nshipster.com/associated-objects для получения дополнительной информации.
Показать ещё 1 комментарий
8

Swift 4//для скрытия навигационной панели тени линии

navigationController?.navigationBar.shadowImage = UIImage()
7

Другой вариант, если вы хотите сохранить прозрачность и не хотите создавать подклассы для каждого UINavigationController в вашем приложении:

#import <objc/runtime.h>

@implementation UINavigationController (NoShadow)

+ (void)load {
    Method original = class_getInstanceMethod(self, @selector(viewWillAppear:));
    Method swizzled = class_getInstanceMethod(self, @selector(swizzled_viewWillAppear:));
    method_exchangeImplementations(original, swizzled);
}

+ (UIImageView *)findHairlineImageViewUnder:(UIView *)view {
    if ([view isKindOfClass:UIImageView.class] && view.bounds.size.height <= 1.0) {
        return (UIImageView *)view;
    }

    for (UIView *subview in view.subviews) {
        UIImageView *imageView = [self findHairlineImageViewUnder:subview];
        if (imageView) {
            return imageView;
        }
    }

    return nil;
}

- (void)swizzled_viewWillAppear:(BOOL)animated {
    UIImageView *shadow = [UINavigationController findHairlineImageViewUnder:self.navigationBar];
    shadow.hidden = YES;

    [self swizzled_viewWillAppear:animated];
}

@end
6

Swift 4 проверено решение одной линии

В Viewdidload() задайте значение по умолчанию для пользовательского контроллера Navigation для ключа "hidesShadow"

override func viewDidLoad() {
    super.viewDidLoad()

    self.navigationController?.navigationBar.setValue(true, forKey: "hidesShadow")

}
  • 0
    спасибо за это ..
  • 1
    Работает отлично !!
Показать ещё 1 комментарий
6

Swift положил это

UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: .Any, barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()

в

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
  • 0
    И это также удаляет цвет фона.
5
Slightly Swift Solution 
func setGlobalAppearanceCharacteristics () {
    let navigationBarAppearace = UINavigationBar.appearance()
    navigationBarAppearace.tintColor = UIColor.white
    navigationBarAppearace.barTintColor = UIColor.blue
    navigationBarAppearace.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
    navigationBarAppearace.shadowImage = UIImage()

}
  • 0
    Спасибо Джеймс! Я не могу понять, почему кто-то отказался от вашего ответа.
  • 0
    если вам это нужно, вы также можете добавить: self.navigationController.navigationBar.translucent = false self.navigationController.navigationBar.clipsToBounds = false self.navigationController.navigationBar.shadowImage = UIImage () self.navigationController.backololor.arol.orolorBar ()
4

В iOS8, если вы установите UINavigationBar.barStyle на .Black, вы можете установить фоновый фон в виде обычного цвета без рамки.

В Swift:

UINavigationBar.appearance().translucent = false
UINavigationBar.appearance().barStyle = UIBarStyle.Black
UINavigationBar.appearance().barTintColor = UIColor.redColor()
  • 0
    Как это понизилось? Работает на 100%.
  • 0
    Это самое чистое решение и лучший способ сделать это. Если вам не нужно поддерживать <iOS 8, нет причин не использовать этот ответ. Благодарю.
Показать ещё 2 комментария
3

Здесь очень простое решение:

self.navigationController.navigationBar.clipsToBounds = YES;
  • 36
    Область строки состояния также обрезается.
2

Вы должны добавить представление к нижней части UISearchBar

let rect = searchController.searchBar.frame;
let lineView : UIView = UIView.init(frame: CGRect.init(x: 0, y: rect.size.height-1, width: rect.size.width, height: 1))
lineView.backgroundColor = UIColor.init(hexString: "8CC73E")
searchController.searchBar.addSubview(lineView)
  • 0
    Я не могу поверить, что это все еще проблема - просто столкнулся с этим снова! Но это решение является наилучшим на данный момент; Спасибо @Socheat
2

Проблема с установкой фонового изображения заключается в удалении размытия. Вы можете удалить его, не устанавливая фоновое изображение. См. Мой ответ здесь.

1

Может также быть скрыт от раскадровки (работает на Xcode 10.1)

Добавив атрибут времени выполнения: hidesShadow - Boolean - True

Изображение 1640

1

Вот способ сделать это без использования изображений, это единственный способ, который работал для меня:

self.navigationController.navigationBar.layer.shadowOpacity = 0;

К сожалению, вам нужно сделать это для каждого файла, в котором вы хотите, чтобы строка не появлялась. Там нет способа сделать это таким образом в appDelegate.

Редактировать:

Установка shadowColor в nil не требуется, это единственная строка, которая вам понадобится.

1

В Swift 3 мы делаем это

Для любого контроллера представления:

navigationBar.shadowImage = UIImage()
setBackgroundImage(UIImage(), for: .default)

Для всего приложения:

UINavigationBar.appearance().setBackgroundImage(UIImage(),barMetrics: .Default)
UINavigationBar.appearance().shadowImage = UIImage()
  • 0
    Требуется Swift 4: UINavigationBar.appearance (). SetBackgroundImage (UIImage (), для: .default) UINavigationBar.appearance (). ShadowImage = UIImage ()
  • 0
    Должен вызываться в AppDelegate в didFinishLaunchingWithOptions
1

pxpgraphics для Swift 3.0.

import Foundation
import UIKit

extension UINavigationBar {

  func hideBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showBottomHairline() {
    let navigationBarImageView = hairlineImageViewInNavigationBar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInNavigationBar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInNavigationBar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}

extension UIToolbar {

  func hideHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = true
  }

  func showHairline() {
    let navigationBarImageView = hairlineImageViewInToolbar(view: self)
    navigationBarImageView!.isHidden = false
  }

  private func hairlineImageViewInToolbar(view: UIView) -> UIImageView? {
    if view is UIImageView && view.bounds.height <= 1.0 {
      return (view as! UIImageView)
    }

    let subviews = (view.subviews as [UIView])
    for subview: UIView in subviews {
      if let imageView: UIImageView = hairlineImageViewInToolbar(view: subview) {
        return imageView
      }
    }
    return nil
  }
}
1

Цель C Ответ на вопрос выше

//удаление строки навигации 1px

[[UINavigationBar appearance] setBackgroundImage:[[UIImage alloc]init] forBarMetrics:UIBarMetricsDefault];
[[UINavigationBar appearance] setShadowImage:[[UIImage alloc] init]];
[[UINavigationBar appearance] setTranslucent:NO];
[[UINavigationBar appearance] setTintColor:[UIColor yourColor]];
1

Для пользователей iOS 9 это сработало для меня. просто добавьте это:

UINavigationBar.appearance().shadowImage = UIImage()
1

Внутри AppDelegate это глобально изменило формат NavBar:

 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    UINavigationBar.appearance().setBackgroundImage(UIImage(), forBarPosition: UIBarPosition.Any, barMetrics: UIBarMetrics.Default)
    UINavigationBar.appearance().shadowImage = UIImage()
    UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    UINavigationBar.appearance().barTintColor = UIColor.redColor()
    UINavigationBar.appearance().translucent = false
    UINavigationBar.appearance().clipsToBounds = false
    UINavigationBar.appearance().backgroundColor = UIColor.redColor()
    UINavigationBar.appearance().titleTextAttributes = [NSFontAttributeName : (UIFont(name: "FONT NAME", size: 18))!, NSForegroundColorAttributeName: UIColor.whiteColor()] }

Не удалось реализовать что-то другое на конкретном VC, но это поможет 90% людей

1
-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    UIImage *emptyImage = [UIImage new];
    self.navigationController.navigationBar.shadowImage = emptyImage;
    [self.navigationController.navigationBar setBackgroundImage:emptyImage forBarMetrics:UIBarMetricsDefault];
}
1

Я только что создал расширение для этого... Извините за форматирование (это мой первый ответ).

Использование:

  override func viewDidLoad() {
    super.viewDidLoad()
    self.navigationController?.hideShadow = true
}

Расширение:

 UINavigationController.swift
//  Created by Ricardo López Rey on 16/7/15.

import Foundation


struct UINavigationControllerExtension {
    static var hideShadowKey : String = "HideShadow"
static let backColor = UIColor(red: 247/255, green: 247/255, blue: 248/255, alpha: 1.0)
}

extension UINavigationController {

    var hideShadow : Bool {
        get {
            if let ret =  objc_getAssociatedObject(self, &UINavigationControllerExtension.hideShadowKey) as? Bool {
                return ret
            } else {
                return false
            }


        }
        set {
            objc_setAssociatedObject(self,&UINavigationControllerExtension.hideShadowKey,newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))

            if newValue {


            self.navigationBar.setBackgroundImage(solidImage(UINavigationControllerExtension.backColor), forBarMetrics: UIBarMetrics.Default)

                self.navigationBar.shadowImage = solidImage(UIColor.clearColor())
            } else {
                self.navigationBar.setBackgroundImage(nil, forBarMetrics: UIBarMetrics.Default)
            }
        }
    }

    private func solidImage(color: UIColor, size: CGSize = CGSize(width: 1,height: 1)) -> UIImage {
        var rect = CGRectMake(0, 0, size.width, size.height)
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        color.setFill()
        UIRectFill(rect)
        var image: UIImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return image
    }


}
1

Я знаю, что это старый поток, но я нашел решение, которое работает очень хорошо:

Подкласс UINavigationBar. В вашем подклассе UINavigationBar переопределение didAddSubview со следующим кодом:

- (void)didAddSubview:(UIView *)subview
{
    [super didAddSubview:subview];

    if ([subview isKindOfClass:[UIImageView class]]) {
        [subview setClipsToBounds:YES];
    }
}
0

Вы также можете использовать

self.navigationController?.hidesNavigationBarHairline = true

как новое дополнение к Swift, которое является простым способом достижения тех же целей, что и решения, представленные выше

0

Привет, это работает для Swift 4.

    override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    self.navigationController?.navigationBar.shadowImage = UIImage()
    self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    self.navigationController?.navigationBar.isTranslucent = false
}

вам нужно поместить это в viewDidLayoutSubviews вместо viewDidLoad

0

В Xamarin Forms это сработало для меня. Просто добавьте это на AppDelegate.cs:

UINavigationBar.Appearance.ShadowImage = new UIImage();
0

Я столкнулся с тем же вопросом, и ни один из ответов не был действительно удовлетворительным. Вот мой прием для Swift3:

func hideNavigationBarLine() {
    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
}

Просто вызовите это из viewDidLoad().

0

Хорошая короткая функция Swift для поиска линии волос в подзонах - это:

 func findHairLineInImageViewUnder(view view: UIView) -> UIImageView? {
    if let hairLineView = view as? UIImageView where hairLineView.bounds.size.height <= 1.0 {
        return hairLineView
    }

    if let hairLineView = view.subviews.flatMap({self.findHairLineInImageViewUnder(view: $0)}).first {
      return hairLineView
    }

    return nil
}
0

Что сработало для меня, и было проще, было создать png (он должен быть размером всего один пиксель на один пиксель в размерах) с требуемым цветом, а затем установить для backgroundImage и shadowImage следующее:

let greenPixel = UIImage(named: "TheNameOfYourPng")
navigationBar.setBackgroundImage(greenPixel, forBarMetrics: UIBarMetrics.Default)
navigationBar.shadowImage = greenPixel
0

Черный стиль чернил сделал это для меня.

[[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];

Все свойства, которые у меня есть (на всякий случай):

    [[UINavigationBar appearance] setBarTintColor:color];
    [[UINavigationBar appearance] setTranslucent:NO];
    [[UINavigationBar appearance] setShadowImage:[UIImage new]];
    [[UINavigationBar appearance] setBarStyle:UIBarStyleBlack];
0

Здесь другой вариант - я думаю, что это работает, только если вы не нуждаетесь в полупрозрачности на панели навигации (я этого не делал). Я добавил только UIView с 1 ​​пикселем в нижнюю часть навигационной панели (1 пиксель ниже навигационной панели) с тем же цветом, что и моя навигационная панель:

UIView *view = [[UIView alloc] init];
[view setBackgroundColor:self.navigationController.navigationBar.barTintColor];
[self.navigationController.navigationBar addSubview:view];
[view mas_makeConstraints:^(MASConstraintMaker *make) {
    make.height.equalTo(@(1.0f));
    make.leading.trailing.equalTo(self.navigationController.navigationBar);
    make.bottom.equalTo(self.navigationController.navigationBar).offset(1.0f);
}];

Я добавляю ограничения с помощью масонства.

0

Мой подход:

UINavigationBar.appearance().setBackgroundImage(
            UIImage(),
            forBarPosition: .Any,
            barMetrics: .Default)
    var _width:CGFloat! = self.navigationController?.navigationBar.layer.frame.width
            var _height:CGFloat! = self.navigationController?.navigationBar.layer.frame.height
            var navBarBg = UIView(frame:CGRectMake(0, 0, _width, _height))
            //solid color for bg
            navBarBg.backgroundColor = UIColor.orangeColor()
            view.addSubview(navBarBg)
0
[tabviewController.view setBackgroundColor:[UIColor blackColor]];

Это для меня [UIColor blackColor] может быть ваш цвет фона, и tabviewController является вашим UITabBarController, если вы его используете!

0

Это может показаться глупым, но эта линия волос появляется только тогда, когда цвет фона для вида viewController установлен на любой цвет, но белый. Я был потрясен, узнав об этом.

Итак, если вы хотите, чтобы он исчез без особых проблем, просто установите цвет фона контроллера в значение WHITE COLOR.

  • 0
    Предложенный метод не работает в Xcode 8.3.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню