用Swift子类化UINavigationBar

5

我正在尝试创建一个自定义的UINavigationBar类,并使用Storyboard将其设置为我的UINavigationController的NavigationBar类。

以下是我的UINavigationBar类的代码:

class CustomNavBar: UINavigationBar {

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)
        // Drawing code
        self.backgroundColor = UIColor.orangeColor()

        let myLabel = UILabel(frame: CGRect(x: 0, y: 4, width: 600, height: 36))
        myLabel.backgroundColor = UIColor.purpleColor()
        myLabel.textColor = UIColor.yellowColor()
        myLabel.text = "Custom NavBar!"

        self.addSubview(myLabel)
    }

}

然后,在Interface Builder中,我使用“Identity Inspector”将其设置为我的“UINavigationController”的“NavigationBar”的类。当我运行应用程序时,它会冻结。它卡在“LaunchScreen.xib”上并且什么也不做。为什么会这样?正确的处理方式是什么?

是的,这很奇怪。我能够复制它,但我不知道为什么会发生这种情况。你可以尝试子类化UINavigationController并在viewDidLoad()中编辑navigationBar属性。我刚刚测试了一下,它不会冻结。 - ad121
我刚刚将您的drawRect函数复制粘贴到了子类化NavigationController的viewDidLoad中。然后,我用navigationBar替换了所有的 self。然后我只是在storyboard中设置了该类。对我来说没有崩溃。 - ad121
是的,我明白了。那很酷。以那种方式做对我也有用 - 所以谢谢你 - 但这不是我想要的。我仍然想创建一个自定义的UINavigationBar类,这样我就可以真正地在我的应用程序中反复使用它。您的解决方案是通过代码创建的 - 这将不得不复制并粘贴到我们使用的每个ViewController中,这有点违背了初衷 - 你知道我的意思吗? - sirab333
由于您正在子类化UINavigationController,因此您不必将代码复制并粘贴到所有视图控制器中,因为它们将共享相同的导航控制器。 - ad121
这是真的 - 但它仍然没有解决我的原始问题/疑问,即:如何对UINavigationBar进行子类化?这不仅是我想要了解的关于此应用程序的问题,也是我未来项目中想要了解的内容。这也涉及到理解Xcode/Storyboards/Code之间的内部工作和交互等更大的问题,你明白我的意思吗? - sirab333
显示剩余10条评论
1个回答

4

关于Swift:

文件-新建文件-iOS源代码-Cocoa Touch类-选择UINavigationBar的子类并命名为CustomNavigationBar。

class CustomNavigationBar: UINavigationBar {

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

            self.backgroundColor = UIColor.redColor()

        }
        required init(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)!
        }
        override func drawRect(rect: CGRect) {

        }   
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接