如何在UITabbar中设置带有所需阴影的左上角和右上角半径?

问题描述 投票:7回答:2

我花了差不多几个小时来搞清楚。然而,它没有发生,最后,我不得不来这里。需要做两件事:

首先,我想在UITabbar的顶部(基本上是TopRight和TopLeft)有一个自发的角半径。

其次,我希望在角落半径之上有一个阴影(如下图所示)。

请看下面的图片Tabbar

让我知道如果我方需要进一步要求,我肯定会提供。

任何帮助将不胜感激。

编辑1

还有一个小问题出现在这里,假设,即使,但是,我们能够做到这一点,Apple审核团队会接受申请吗?我对此并不感到紧张和好奇。

swift uitabbar rounded-corners xcode10 cornerradius
2个回答
5
投票

问:这里又出现了一个小问题,假设,即使,但是,我们能够做到这一点,Apple审核团队会接受申请吗?答:是的他们接受你的应用程序我添加了这种TabBar。

创建自定义TabBar

HomeTabController

import UIKit

class HomeTabController: UITabBarController
{
    var viewCustomeTab : CustomeTabView!
    var lastSender : UIButton!

    //MARK:- ViewController Methods
    override func viewDidLoad()
    {
        super.viewDidLoad()

        UITabBar.appearance().shadowImage = UIImage()

        allocateTabItems()
    }

    //MARK:- Prepare Methods
    // Allocate shop controller with tab bar
    func allocateTabItems()
    {

        let vc1 = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "Avc") as? Avc
        let item1 = UINavigationController(rootViewController: vc1!)
        self.navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
        self.navigationController?.navigationBar.shadowImage = UIImage()
        self.viewControllers = [item1]
        createTabBar()
    }

    func createTabBar()
    {
        viewCustomeTab = CustomeTabView.instanceFromNib()
        viewCustomeTab.translatesAutoresizingMaskIntoConstraints = false
        viewCustomeTab.call()

        self.view.addSubview(viewCustomeTab)

        if #available(iOS 11, *)
        {
            let guide = view.safeAreaLayoutGuide
            NSLayoutConstraint.activate([guide.bottomAnchor.constraint(equalToSystemSpacingBelow: viewCustomeTab.bottomAnchor, multiplier: 0), viewCustomeTab.leadingAnchor.constraint(equalToSystemSpacingAfter: guide.leadingAnchor, multiplier: 0), guide.trailingAnchor.constraint(equalToSystemSpacingAfter: viewCustomeTab.trailingAnchor, multiplier: 0), viewCustomeTab.heightAnchor.constraint(equalToConstant: 70) ])
        }
        else
        {
            let standardSpacing: CGFloat = 0
            NSLayoutConstraint.activate([viewCustomeTab.topAnchor.constraint(equalTo: topLayoutGuide.bottomAnchor, constant: standardSpacing), bottomLayoutGuide.topAnchor.constraint(equalTo: viewCustomeTab.bottomAnchor, constant: standardSpacing)
                ])
        }

        viewCustomeTab.btnTab1.addTarget(self, action: #selector(HomeTabController.buttonTabClickAction(sender:)), for: .touchUpInside)
        viewCustomeTab.btnTab2.addTarget(self, action: #selector(HomeTabController.buttonTabClickAction(sender:)), for: .touchUpInside)
        viewCustomeTab.btnTab3.addTarget(self, action: #selector(HomeTabController.buttonTabClickAction(sender:)), for: .touchUpInside)
        viewCustomeTab.btnTab4.addTarget(self, action: #selector(HomeTabController.buttonTabClickAction(sender:)), for: .touchUpInside)
        viewCustomeTab.btnTab5.addTarget(self, action: #selector(HomeTabController.buttonTabClickAction(sender:)), for: .touchUpInside)

        //self.view.layoutIfNeeded()
        viewCustomeTab.layoutIfNeeded()
        viewCustomeTab.btnTab1.alignContentVerticallyByCenter(offset: 3)
        viewCustomeTab.btnTab2.alignContentVerticallyByCenter(offset: 3)
        viewCustomeTab.btnTab3.alignContentVerticallyByCenter(offset: 3)
        viewCustomeTab.btnTab4.alignContentVerticallyByCenter(offset: 3)
        viewCustomeTab.btnTab5.alignContentVerticallyByCenter(offset: 3)
        viewCustomeTab.btnTab1.isSelected = true
    }

    //MARK:- Button Click Actions
    //Manage Tab From Here
    func setSelect(sender:UIButton)
    {
        viewCustomeTab.btnTab1.isSelected = false
        viewCustomeTab.btnTab2.isSelected = false
        viewCustomeTab.btnTab3.isSelected = false
        viewCustomeTab.btnTab4.isSelected = false
        viewCustomeTab.btnTab5.isSelected = false
        sender.isSelected = true
    }

    @objc func buttonTabClickAction(sender:UIButton)
    {
        //self.selectedIndex = sender.tag
        if sender.tag == 0
        {
            let vc1 = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "Bvc") as? Bvc

             let item1 = UINavigationController(rootViewController: vc1!)
            item1.navigationBar.isHidden = false
            self.viewControllers = [item1]
            setSelect(sender: viewCustomeTab.btnTab1)
            return
        }

        if sender.tag == 1
        {
            let vc2 = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "Cvc") as? Cvc
            let item2 = UINavigationController(rootViewController: vc2!)
            item2.navigationBar.isHidden = false
            item2.navigationBar.isTranslucent = false
            self.viewControllers = [item2]
            setSelect(sender: viewCustomeTab.btnTab2)
            return
        }

        if sender.tag == 2
        {
            let vc3 = UIStoryboard.init(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "Dvc") as? Dvc
            let item3 = UINavigationController(rootViewController: vc3!)
            item3.navigationBar.isHidden = false
             item3.navigationBar.isTranslucent = false
            self.viewControllers = [item3]
            setSelect(sender: viewCustomeTab.btnTab3)
            return
        }

        if sender.tag == 3
        {

        }

        if sender.tag == 4
        {

        }
    }
}


Create Custom View For Shadow Effect and For + Button. 

import UIKit

class CustomeTabView: UIView
{
    @IBOutlet weak var btnTab5: UIButton!
    @IBOutlet weak var btnTab4: UIButton!
    @IBOutlet weak var btnTab3: UIButton!
    @IBOutlet weak var btnTab2: UIButton!
    @IBOutlet weak var btnTab1: UIButton!
    @IBOutlet weak var vRadius: UIView!


    class func instanceFromNib() -> CustomeTabView
    {
        return UINib(nibName: "CustomeTabView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! CustomeTabView
    }

    private var shadowLayer: CAShapeLayer!

    override func layoutSubviews()
    {
        super.layoutSubviews()

        let shadowSize : CGFloat = 2.0

        let shadowPath = UIBezierPath(roundedRect: CGRect(x: -shadowSize / 2,   y: -shadowSize / 2, width: self.vRadius.frame.size.width, height: self.vRadius.frame.size.height), cornerRadius : 20)

        self.vRadius.layer.masksToBounds = false
        self.vRadius.layer.shadowColor = UIColor.black.cgColor
        self.vRadius.layer.shadowOffset = CGSize.zero//(width: self.vRadius.frame.size.width, height: self.vRadius.frame.size.height)
        self.vRadius.layer.shadowOpacity = 0.5
        self.vRadius.layer.shadowPath = shadowPath.cgPath
        self.vRadius.layer.cornerRadius = 20
      }

OpenImg


2
投票

Swift 4.2

您可以使用自定义选项卡栏控制器的某些自定义视图来实现此目的。您可以通过仅编辑自定义视图来自定义颜色和阴影。

自定义标签栏控制器

import UIKit
class MainTabBarController: UITabBarController{

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        tabBar.backgroundImage = UIImage.from(color: .clear)
        tabBar.shadowImage = UIImage()

        let tabbarBackgroundView = RoundShadowView(frame: tabBar.frame)
        tabbarBackgroundView.cornerRadius = 25
        tabbarBackgroundView.backgroundColor = .white
        tabbarBackgroundView.frame = tabBar.frame
        view.addSubview(tabbarBackgroundView)

        let fillerView = UIView()
        fillerView.frame = tabBar.frame
        fillerView.roundCorners([.topLeft, .topRight], radius: 25)
        fillerView.backgroundColor = .white
        view.addSubview(fillerView)

        view.bringSubviewToFront(tabBar)
    }

圆角阴影视图

import UIKit

class RoundShadowView: UIView {

    let containerView = UIView()

    override init(frame: CGRect) {
        super.init(frame: frame)
        layoutView()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    func layoutView() {

        // set the shadow of the view's layer
        layer.backgroundColor = UIColor.clear.cgColor
        layer.shadowColor = UIColor.black.cgColor
        layer.shadowOffset = CGSize(width: 0, height: -8.0)
        layer.shadowOpacity = 0.12
        layer.shadowRadius = 10.0
        containerView.layer.cornerRadius = cornerRadius
        containerView.layer.masksToBounds = true

        addSubview(containerView)
        containerView.translatesAutoresizingMaskIntoConstraints = false

        // pin the containerView to the edges to the view
        containerView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        containerView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
        containerView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        containerView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
    }
}

UIImage扩展

import UIKit

extension UIImage {
    static func from(color: UIColor) -> UIImage {
        let rect = CGRect(x: 0, y: 0, width: 1, height: 1)
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        context!.setFillColor(color.cgColor)
        context!.fill(rect)
        let img = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        return img!
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.