覆盖UITabBarController中的UITabBar

问题描述 投票:0回答:1

我尝试在UITabController中自定义Tabbar时遇到问题。当我使用以下解决方案用我的自定义Tabbar覆盖默认Tabbar时,该Tabbar会显示为没有任何项目,并且不会触发任何单击。这是我的自定义标签栏的代码:

import UIKit
@IBDesignable
class MyTabBar: UITabBar {
    private var shapeLayer: CALayer?
override var frame: CGRect {
    get {
        return super.frame
    }
    set {
        var tmp = newValue
        if let superview = superview, tmp.maxY !=
            superview.frame.height {
            tmp.origin.y = superview.frame.height - tmp.height
        }

        super.frame = tmp
    }
}
    private func addShape() {
        let shapeLayer = CAShapeLayer()
        shapeLayer.path = createPath()
        shapeLayer.strokeColor = UIColor.lightGray.cgColor
        shapeLayer.fillColor = UIColor.white.cgColor
        shapeLayer.lineWidth = 1.0
        //The below 4 lines are for shadow above the bar. you can skip them if you do not want a shadow
        shapeLayer.shadowOffset = CGSize(width: 0, height: 0)
        shapeLayer.shadowRadius = 10
        shapeLayer.shadowColor = UIColor.gray.cgColor
        shapeLayer.shadowOpacity = 0.3

        if let oldShapeLayer = self.shapeLayer {
            self.layer.replaceSublayer(oldShapeLayer, with: shapeLayer)
        } else {
            self.layer.insertSublayer(shapeLayer, at: 0)
        }
        self.shapeLayer = shapeLayer
    }
    override func draw(_ rect: CGRect) {
        self.addShape()
    }
    func createPath() -> CGPath {
        let height: CGFloat = 30.0
        let path = UIBezierPath()
        let centerWidth = self.frame.width / 2
        path.move(to: CGPoint(x: 0, y: 0)) // start top left
        path.addLine(to: CGPoint(x: (centerWidth - height * 2), y: 0)) // the beginning of the trough

        path.addCurve(to: CGPoint(x: centerWidth, y: -height),
        controlPoint1: CGPoint(x: centerWidth - height * 2, y: 0), controlPoint2: CGPoint(x: centerWidth - height, y: -height))

        path.addCurve(to: CGPoint(x: centerWidth + height * 2, y: 0),
        controlPoint1: CGPoint(x: centerWidth, y: -height), controlPoint2: CGPoint(x: (centerWidth + height), y: -height))

        path.addLine(to: CGPoint(x: self.frame.width, y: 0))
        path.addLine(to: CGPoint(x: self.frame.width, y: self.frame.height))
        path.addLine(to: CGPoint(x: 0, y: self.frame.height))
        path.close()

        return path.cgPath
    }
    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
           guard !clipsToBounds && !isHidden && alpha > 0 else { return nil }
           for member in subviews.reversed() {
               let subPoint = member.convert(point, from: self)
               guard let result = member.hitTest(subPoint, with: event) else { continue }
               return result
           }
           return nil
       }
}

这是我的TabbarController的代码:

@objc class MyTabBarController: UITabBarController {
override var tabBar: UITabBar {
    return MyTabBar()
}
override func viewDidLoad() {
    super.viewDidLoad()
    setupMiddleButton()
}
func setupMiddleButton() {
    let addLostBtn = UIButton(frame: CGRect(x: (self.view.bounds.width / 2)-25, y: -20, width: 50, height: 50))
    //STYLE THE BUTTON YOUR OWN WAY
    addLostBtn.setBackgroundImage(UIImage(named: "addLostIcon"), for: .normal)
    //add to the tabbar and add click event
    self.tabBar.addSubview(addLostBtn)
    addLostBtn.addTarget(self, action: #selector(self.menuButtonAction), for: .touchUpInside)
    self.view.layoutIfNeeded()
}

// Menu Button Touch Action
@objc func menuButtonAction(sender: UIButton) {
    self.selectedIndex = 2   //to select the middle tab. use "1" if you have only 3 tabs.
}

}

[我认为,以编程方式创建UITabbarController时,Apple不允许覆盖tabBar。最后,我在堆栈中检查了此问题Link,但未找到任何解决方案。任何帮助请

swift uitabbarcontroller uitabbar
1个回答
0
投票

我认为无法使用上面的代码覆盖UITabBar。因此,我基于此链接使用了自定义UIViewController和自定义UIView Tabbar解决了该问题]

Link

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