Search code examples
iosswiftxcodeuinavigationbar

UINavigationItem is behind UINavigationBar


I've set up a UINavigationBar to have rounded bottom corners with shadow, but it removed my UINavigationItem. I've tried to set it back programatically but it sets it behind the top bar item.

    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"
    }
}

offset is view.safeAreaInsets.top! Picture attached, as you can see, the title is behind the layer.

Text is behind

As you can see, layer works


Solution

  • I have edited @Daljeet's code and thanks to that I've found the solution:

            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)
    

    Thanks again @Daljeet!


    You can try below code:

     // 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!)
    

    Add this line of code after setting the title.