web-dev-qa-db-ja.com

UITabbarの上部境界線を削除します

私はアプリでUITabbarを使用しています。 UITabbarの上部に上部境界線があります。下の画像を参照してください:-

私はそれをグーグルで検索し、次のような提案されたコードを試しました:-

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

また

[[UITabBar appearance] setShadowImage:nil];

self.navigationController.toolbar.clipsToBounds = YES;

しかし、それらのどれも機能していません。解決策はありますか?

enter image description here

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

またはあなたが使用することができます

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

または

 [[UITabBar appearance] setShadowImage:nil];
8
Usama

tabBar.clipsToBounds = YES;は私のための仕事です。

12
Allen

これはiOS11、XCode9.4でうまくいきました

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

Swift5は私のために働きます

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


    }
3
omar alfawzan

上記の答えの1つを改善する-それでも少しハックですが、うまく機能します。上記の答えは、カスタム画像でimageViewを非表示にします。

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

UITabbarから境界線を削除するには、次の2行のコードのみを追加する必要があります。

- (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;
}

前:

enter image description here

後:

enter image description here

UPDATE:次のコードのように、背景画像を設定し、影をゼロとして設定することもできます

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

出力:

enter image description here

1
Nitin Gohel

shadowImageUITabbarプロパティは、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()


ここにAppleガイドライン shadowImage

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

デフォルトはnilです。 nil以外の場合、デフォルトのシャドウ画像の代わりに表示するカスタムシャドウ画像。カスタムシャドウを表示するには、カスタム背景画像も-setBackgroundImage:で設定する必要があります(デフォルトの背景画像を使用する場合は、デフォルトのシャドウ画像が使用されます)。

1
Krunal

限界まで切り詰めないと答えが見つかりませんでした。そして、UITabBar.appearance().shadowImageの使い方は時代遅れのようです

だから私は完璧ではないが、iOS10とiOS11のUITabBarシャドウを削除するための実用的で安全なソリューションを作成しましたなし境界へのクリッピング。 iPhone Xでも動作します(動作しなかった場合は奇妙になります;))

以下のコードは、UITabBarController階層を実行し、シャドウビューを探します。これは(今のところ)_UIBarBackgroundのサブビューであるUIImageViewです。

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()
    }
}
0
Pavel Stepanov

コントローラメソッドを更新します

override func viewDidLoad() {
    super.viewDidLoad()
    self.tabBar.clipsToBounds = true
    if #available(iOS 13, *) {
        self.tabBar.standardAppearance.shadowImage = nil
        self.tabBar.standardAppearance.shadowColor = nil
    }
}
0