Ответ 1
[self.tabBar setValue:@(YES) forKeyPath:@"_hidesShadow"];
или вы можете использовать
[[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"transparentShadow.png"]];
или
[[UITabBar appearance] setShadowImage:nil];
Я использую UITabbar в приложении. В верхней части UITabbar находится верхняя пограничная линия. См. Рисунок ниже: -
Я попытался использовать этот код как: -
[[UITabBar appearance] setShadowImage:[[UIImage alloc] init]];
Кроме
[[UITabBar appearance] setShadowImage:nil];
self.navigationController.toolbar.clipsToBounds = YES;
Но никто из них не работает. Любое решение?
[self.tabBar setValue:@(YES) forKeyPath:@"_hidesShadow"];
или вы можете использовать
[[UITabBar appearance] setShadowImage:[UIImage imageNamed:@"transparentShadow.png"]];
или
[[UITabBar appearance] setShadowImage:nil];
tabBar.clipsToBounds = YES;
работает для меня.
Это сработало для меня для iOS 11, XCode 9.4
UITabBar.appearance().shadowImage = UIImage()
UITabBar.appearance().backgroundImage = UIImage()
UITabBar.appearance().backgroundColor = UIColor.white
Swift 5 работает для меня
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
myTabBar.clipsToBounds = true
}
Улучшение одного из ответов выше - все еще немного хак, но работает лучше. Ответ выше будет скрывать imageView с пользовательским изображением.
for tabBarSubview in self.tabBar.subviews {
let tabBarSubviewName = String(describing: type(of: tabBarSubview))
guard tabBarSubviewName == "_UIBarBackground" else { continue }
tabBarSubview.clipsToBounds = true
}
Вам нужно добавить только две строки кода для удаления границы с вашего 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:
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: (если используется фоновое изображение по умолчанию, теневое изображение по умолчанию будет используется).
Я не мог найти ответ без ограничения до предела. И способ использования 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()
}
}
Рабочее решение с 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()
}
}
}