Tengo un tabBarController con un tabBar curvo a través caShapeLayer .
Mi problema es que el tabBar de marco rectangular recorta la parte inferior de los viewControllers de los niños.
Mi objetivo/esperanza era pasar por debajo y sujetar la parte inferior por el marco curvo . Ver imagen para referencia.
Cualquier orientación sería muy apreciada.
Código para TabBar curvo en TabBarController
override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = .blue self.tabBar.backgroundColor = .clear self.tabBar.barStyle = .default self.tabBar.isTranslucent = false self.tabBar.clipsToBounds = false hideTabBarBorder() } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() addTabBarShape() } func addTabBarShape() { let shapeLayer = CAShapeLayer() let offset:CGFloat = tabBar.bounds.width/3.5 let bounds: CGRect = tabBar.bounds let rectBounds: CGRect = CGRect(x: bounds.origin.x, y: bounds.origin.y + (bounds.size.height / 2), width: bounds.size.width, height: bounds.size.height / 2) let rectPath: UIBezierPath = UIBezierPath(rect: rectBounds) let ovalBounds: CGRect = CGRect(x: bounds.origin.x - (offset / 2), y: bounds.origin.y, width: bounds.size.width + offset, height: bounds.size.height) let ovalPath: UIBezierPath = UIBezierPath(ovalIn: ovalBounds) rectPath.append(ovalPath) shapeLayer.path = rectPath.cgPath shapeLayer.fillColor = .blue shapeLayer.shadowPath = rectPath.cgPath shapeLayer.shadowColor = UIColor.black.cgColor shapeLayer.shadowOpacity = 0.1 shapeLayer.shadowRadius = 20 shapeLayer.shadowOffset = CGSize(width: 0, height: -8) shapeLayer.shouldRasterize = true shapeLayer.rasterizationScale = UIScreen.main.scale if let oldShapeLayer = self.tabBarShapeLayer { self.tabBar.layer.replaceSublayer(oldShapeLayer, with: shapeLayer) } else { self.tabBar.layer.insertSublayer(shapeLayer, at: 0) } self.tabBarShapeLayer = shapeLayer } func hideTabBarBorder() { self.tabBar.backgroundImage = UIImage.from(color: Constants.style.darkBlue) self.tabBar.shadowImage = UIImage() } 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! } }Esto se debe a que el ViewController secundario no actualizó su restricción y se refiere a la misma restricción de tabcontroller. Solo necesita revisar la restricción inferior del controlador. Estoy usando Snapkit aquí para corregir la restricción antes de que aparezca la vista. Puede establecer el margen inferior del controlador igual al superView y manejar el desplazamiento de la barra de pestañas dentro de su controlador.
Básicamente, esto ignorará la presencia de la barra de pestañas en la parte inferior.
import UIKit import SnapKit class SomeViewController: UIViewController { override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) updateConstraints() } func updateConstraints() { view.snp.makeConstraints { make in make.edges.equalToSuperview() } } }Mi solución fue dibujar la curva en un punto y más alto que el marco de la barra de pestañas...
Debe configurar backgroundImage en algo que no sea visible para que la vista parezca estar recortada por la barra de pestañas.
No estoy seguro de por qué lo está configurando explícitamente en UIImage.from(color: Constants.style.darkBlue) en su ejemplo.
Lo siguiente + copiar todo su otro código funciona bien para mí:
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() addTabBarShape() tabBar.backgroundImage = UIImage() tabBar.shadowImage = UIImage() } También asegúrese de conectar el anclaje inferior de la vista (por ejemplo, UITableView ) no a view.safeAreaLayoutGuide.bottomAnchor (como lo haría normalmente) sino a view.bottomAnchor para que aparezca recortado por la barra de pestañas.
(Cambió algunos colores en esa implementación, pero aquí puede ver cómo recorta un UITableView )