Swift:按钮居中的自定义导航栏

Swift: Custom Navigationbar with centered buttons

我已经编写了一个自定义导航栏,但问题是我的按钮内的文本没有完全对齐。例如,请参见 + 按钮。

有什么改进方法吗?

import UIKit

class DashboardNavbar: UINavigationBar {

    var titleLabel: UILabel?

    private var plusButton: UIButton?
    private var editButton: UIButton?

    var tap: UIGestureRecognizer?

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

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        isTranslucent = false
        addTitleLabel()
        addPlusButton()
        addEditButton()
    }



    private func addTitleLabel() {
        titleLabel = UILabel()
        titleLabel?.textColor = Styling.navigationbarTintColor
        titleLabel?.translatesAutoresizingMaskIntoConstraints = false
        titleLabel?.font = UIFont(name: "DIN Alternate", size: 17)

        if let titleLabel = titleLabel{

            addSubview(titleLabel)

            let leadingConstraint = NSLayoutConstraint(item: titleLabel, attribute: .leading, relatedBy: .equal, toItem: self, attribute: .leading, multiplier: 1.0, constant: 15)
            addConstraint(leadingConstraint)
            let centerYConstraint = NSLayoutConstraint(item: titleLabel, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0)
            addConstraint(centerYConstraint)
        }
    }

    private func addPlusButton(){


        plusButton = UIButton(type: .custom)
        plusButton?.setTitle("+", for: .normal)
        plusButton?.layer.backgroundColor = Styling.navigationbarTintColor.cgColor
        plusButton?.layer.cornerRadius = 15
        plusButton?.setTitleColor(.black, for: .normal)
        plusButton?.titleLabel?.font = UIFont(name: "DIN Alternate", size: 20)
        plusButton?.contentVerticalAlignment = .center
        plusButton?.contentHorizontalAlignment = .center
        plusButton?.titleLabel?.baselineAdjustment = .alignCenters


        if let plusButton = plusButton{
            addSubview(plusButton)
            plusButton.translatesAutoresizingMaskIntoConstraints = false

            let trailingConstraint = NSLayoutConstraint(item: plusButton, attribute: .trailing, relatedBy: .equal, toItem: self, attribute: .trailing, multiplier: 1.0, constant: -15)
            addConstraint(trailingConstraint)

            let centerYConstraint = NSLayoutConstraint(item: plusButton, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0)
            addConstraint(centerYConstraint)

            let widthC = NSLayoutConstraint(item: plusButton, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 30)
            addConstraint(widthC)

            let heightC = NSLayoutConstraint(item: plusButton, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 30)
            addConstraint(heightC)
        }

    }

    private func addEditButton(){

        editButton = UIButton(type: .custom)
        editButton?.setTitle(LocalizedString("EDIT"), for: .normal)
        editButton?.layer.backgroundColor = Styling.navigationbarTintColor.cgColor
        editButton?.layer.cornerRadius = 15
        editButton?.setTitleColor(.black, for: .normal)
        editButton?.titleLabel?.font = UIFont(name: "DIN Alternate", size: 16)
        editButton?.contentVerticalAlignment = .center
        editButton?.contentHorizontalAlignment = .center
        editButton?.titleLabel?.baselineAdjustment = .alignCenters

        if let editButton = editButton{
            addSubview(editButton)
            editButton.translatesAutoresizingMaskIntoConstraints = false
            let trailingConstraint = NSLayoutConstraint(item: editButton, attribute: .trailing, relatedBy: .equal, toItem: plusButton!, attribute: .leading, multiplier: 1.0, constant: -15)
            addConstraint(trailingConstraint)
            let centerYConstraint = NSLayoutConstraint(item: editButton, attribute: .centerY, relatedBy: .equal, toItem: self, attribute: .centerY, multiplier: 1.0, constant: 0)
            addConstraint(centerYConstraint)

            let widthC = NSLayoutConstraint(item: editButton, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 80)
            addConstraint(widthC)
            let heightC = NSLayoutConstraint(item: editButton, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 30)
            addConstraint(heightC)
        }
    }






    func setTitle(title: String){
        titleLabel?.text = title
    }
}

有几种方法可以纠正这个问题:

  1. 使用 + 图片,图片将正确居中于 UIButton

  2. 更改 UIButton 的标题插图,从底部和左侧多一些插图,UIButtontitleInsets 属性;

  3. 更改字体o_O 这是个愚蠢的想法,但也可行,您可以编辑字体并使“+”号在绘图区域居中。

希望对您有所帮助!祝你好运!