UINavigationItem 在 UINavigationBar 后面

UINavigationItem is behind UINavigationBar

我已经将 UINavigationBar 设置为带有阴影的圆底角,但它删除了我的 UINavigationItem。我试图以编程方式将其设置回来,但它设置在顶部栏项后面。

    class RoundedShadowCorners {
    func shadowTopBar(_ topBar: UINavigationBar,_ offset: CGFloat,_ navigationItem: UINavigationItem){
        topBar.isTranslucent = false
        topBar.tintColor = UIColor.orange

        topBar.setBackgroundImage(UIImage(), for: UIBarMetrics.default)
        topBar.shadowImage = UIImage()
        topBar.backgroundColor = UIColor.white
        let shadowView = UIView(frame: CGRect(x: 0, y: -offset, width: (topBar.bounds.width), height: (topBar.bounds.height) + offset))
        shadowView.backgroundColor = UIColor.white
        topBar.insertSubview(shadowView, at: 1)

        let shadowLayer = CAShapeLayer()
        shadowLayer.path = UIBezierPath(roundedRect: shadowView.bounds, byRoundingCorners: [.bottomLeft , .bottomRight , .topLeft], cornerRadii: CGSize(width: 20, height: 20)).cgPath

        shadowLayer.fillColor = UIColor.white.cgColor

        shadowLayer.shadowColor = UIColor.darkGray.cgColor
        shadowLayer.shadowPath = shadowLayer.path
        shadowLayer.shadowOffset = CGSize(width: 2.0, height: 2.0)
        shadowLayer.shadowOpacity = 0.8
        shadowLayer.shadowRadius = 2

        shadowView.layer.insertSublayer(shadowLayer, at: 0)

        topBar.prefersLargeTitles = true
        topBar.topItem?.title = "HJFSKDJKA"
    }
}

偏移量是view.safeAreaInsets.top!附上图片,如你所见,标题在图层后面。

Text is behind

As you can see, layer works

我编辑了@Daljeet 的代码,多亏了我找到了解决方案:

        let titleLabelView = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 40))
        titleLabelView.backgroundColor = UIColor.clear
        titleLabelView.textAlignment = .center
        titleLabelView.textColor = UIColor.black
        titleLabelView.font = UIFont.systemFont(ofSize: 17)
        titleLabelView.adjustsFontSizeToFitWidth = true
        titleLabelView.text = navigationItem.title

        let labelView: UIView = titleLabelView
        topBar.insertSubview(labelView, aboveSubview: shadowView)
        let yCoordPlaceholder = labelView.center.y
        labelView.center = CGPoint(x: safeArea.width/2, y: yCoordNavPlaceholder)

再次感谢@Daljeet!


您可以试试下面的代码:

 // First create custom label
 UILabel *titleLabelView = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; 
 [titleLabelView setBackgroundColor:[UIColor clearColor]];
 [titleLabelView setTextAlignment: NSTextAlignmentCenter];
 [titleLabelView setTextColor:[UIColor whiteColor]];
 [titleLabelView setFont:[UIFont systemFontOfSize: 27]]; 
 [titleLabelView setAdjustsFontSizeToFitWidth:YES]; 
 titleLabelView.text = @"You text here";
 // here set in navBar titleView
 topBar.topItem.titleView = titleLabelView;


topBar.bringSubviewToFront(topBar.topItem!.titleView!)

在设置标题后添加这行代码