Удалить верхнюю границу линии UITabbar

Я использую UITabbar в приложении. В верхней части UITabbar находится верхняя пограничная линия. См. Рисунок ниже: -

Я попытался использовать этот код как: -

[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];

Кроме

[[UITabBar appearance] setShadowImage:nil];

self.navigationController.toolbar.clipsToBounds = YES;

Но никто из них не работает. Любое решение?

введите описание изображения здесь

Ответ 1

[self.tabBar setValue:@(YES) forKeyPath:@"_hidesShadow"];

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

[[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"transparentShadow.png"]];

или

 [[UITabBar appearance] setShadowImage:nil];

Ответ 2

tabBar.clipsToBounds = YES; работает для меня.

Ответ 3

Это сработало для меня для iOS 11, XCode 9.4

UITabBar.appearance().shadowImage = UIImage()
UITabBar.appearance().backgroundImage = UIImage()
UITabBar.appearance().backgroundColor = UIColor.white

Ответ 4

Swift 5 работает для меня

override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        myTabBar.clipsToBounds = true


    }

Ответ 5

Улучшение одного из ответов выше - все еще немного хак, но работает лучше. Ответ выше будет скрывать imageView с пользовательским изображением.

    for tabBarSubview in self.tabBar.subviews {
        let tabBarSubviewName = String(describing: type(of: tabBarSubview))
        guard tabBarSubviewName == "_UIBarBackground" else { continue }
        tabBarSubview.clipsToBounds = true
    }

Ответ 6

Вам нужно добавить только две строки кода для удаления границы с вашего UITabbar:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    [[UITabBar appearance] setBackgroundImage:[[UIImage alloc] init]];
    [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
    // Override point for customization after application launch.
    return YES;
}

До:

введите описание изображения здесь

После:

введите описание изображения здесь

UPDATE: Вы также можете установить фоновое изображение и установить тень как нуль, как следующий код

    UIImage* tabBarBackground = [UIImage imageNamed:@"tabbar.png"];
    [[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
    [[UITabBar appearance] setBackgroundImage:tabBarBackground];

OUTPUT:

введите описание изображения здесь

Ответ 7

shadowImage свойство UITabbar отвечает за эту пограничную линию (оттенок серого цвета) на UITabbar. Обновить значение этого свойства, чтобы удалить его.

Попробуйте это, ** Objective-C **

//Remove shadow image by assigning nil value.
[[UITabBar appearance] setShadowImage: nil];

// or 

// Assing UIImage instance without image reference
[[UITabBar appearance] setShadowImage: [[UIImage alloc] init]];

** Swift **

//Remove shadow image by assigning nil value.
UITabBar.appearance().shadowImage = nil

// or 

// Assing UIImage instance without image reference
UITabBar.appearance().shadowImage = UIImage()


Вот яблочный ориентир для shadowImage

@available(iOS 6.0, *)
open var shadowImage: UIImage?

Значение по умолчанию равно нулю. Когда не-nil, вместо теневого изображения вместо теневое изображение по умолчанию. Чтобы пользовательский тень отображалась, пользовательский фоновое изображение также должно быть установлено с -setBackgroundImage: (если используется фоновое изображение по умолчанию, теневое изображение по умолчанию будет используется).

Ответ 8

Я не мог найти ответ без ограничения до предела. И способ использования UITabBar.appearance().shadowImage кажется, устарел

Поэтому я сделал не идеальное, но работающее и безопасное решение, чтобы удалить тень UITabBar для iOS10 и iOS11 без всяких ограничений. Работает на iPhone X тоже (было бы странно, если бы не было;))

Код ниже проходит через иерархию UITabBarController и ищет теневое представление. Какой (на данный момент) является UIImageView который является _UIBarBackground

extension UITabBarController {
    public func hideTopShadow() {
        // looking for tabBar
        for subview in self.view.subviews {
            let tabBarSubviewName = String(describing: type(of: subview))
            guard tabBarSubviewName == "UITabBar" else { continue }

            // looking for _UIBarBackground. The other subivews are UITabBarButtons
            for tabBarSubview in subview.subviews {
                let tabBarSubviewName = String(describing: type(of: tabBarSubview))
                guard tabBarSubviewName == "_UIBarBackground" else { continue }

                // looking for UIImageView. This is the only subview
                for shadowView in tabBarSubview.subviews where shadowView is UIImageView {
                    shadowView.isHidden = true
                    return
                }
            }
        }
        print(" **** ERROR: Could not find the shadow view \(self.self) \(#function)")
    }
}

Возможное использование. У меня есть подкласс UITabBarController, поэтому я сделал следующее:

// to avoid excessive runs through the hierarchy after the shadow was hidden
fileprivate var hasHiddenShadow: Bool = false

override open func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard !hasHiddenShadow else { return }

    hasHiddenShadow = true
    DispatchQueue.main.asyncAfter(deadline: .now()) {
        self.hideTopShadow()
    }
}

Ответ 9

Рабочее решение с iOS 13 & Swift 5:

/** 
 * A custom subclass of 'UITabBarController' to use whenever you want 
 * to hide the upper border of the 'UITabBar'.
 */
class TabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Removing the upper border of the UITabBar.
        // 
        // Note: Don't use 'tabBar.clipsToBounds = true' if you want 
        // to add a custom shadow to the 'tabBar'!
        // 
        if #available(iOS 13, *) {
            // iOS 13:
            let appearance = tabBar.standardAppearance
            appearance.configureWithOpaqueBackground()
            appearance.shadowImage = nil
            appearance.shadowColor = nil
            tabBar.standardAppearance = appearance
        } else {
            // iOS 12 and below:
            tabBar.shadowImage = UIImage()
            tabBar.backgroundImage = UIImage()
        }
    } 
}