在导航栏中添加图像

时间:2018-01-15 03:22:12

标签: ios swift xcode cocoa-touch swift4

我想知道将图像放入导航栏的最佳方法。

我最初的想法是为UINavigationController创建一个cocoa触摸类并以这种方式设置它,但我似乎可以使用下面的代码使它工作:

class NavBarImage: UINavigationController {

    override func awakeFromNib() {

    }

    override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        self.setupView()
    }


    func setupView()
    {
       let navController = navigationController!

       let image = #imageLiteral(resourceName: "BarTabsNavLogoWhite")
       let imageView = UIImageView(image: image)

       let bannerWidth = navController.navigationBar.frame.size.width
       let bannerHeight = navController.navigationBar.frame.size.height

       let bannerX = bannerWidth / 2 - image.size.width / 2
       let bannerY = bannerHeight / 2 - image.size.height / 2

       imageView.frame = CGRect(x: bannerX, y: bannerY, width: bannerWidth, 
       height: bannerHeight)
         imageView.contentMode = .scaleAspectFit

       navigationItem.titleView = imageView
    }
}

我在navController = navigationController上一直得到“在展开可选值时意外发现nil!”。

然而,这种方法也对我有用。我为UINavigationBar创建了一个可可触摸类,并使用下面的代码:

import UIKit

class NavBarImg: UINavigationBar {

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

    required init(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)!
        initialise()
    }

    func initialise(){

        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 225, height: 40))
        imageView.contentMode = .scaleAspectFit
        let image = UIImage(named:"BarTabsNavLogoWhite")
        imageView.image = image
        imageView.frame.origin = CGPoint(x: self.superview?.center.x, y: self.superview?.center.y)
        addSubview(imageView)
    }
}

唯一的问题是,在不同的iPhone上,我无法弄清楚如何使图像始终以使用CGPoint的任何设备为中心。

然后,我找到并实现的最后一个方法由以下代码完成:

@IBDesignable class test: UINavigationBar { @IBInspectable var imageTitle: UIImage? = nil {

    didSet {

        guard let imageTitle = imageTitle else {

            topItem?.titleView = nil

            return
        }

        let imageView = UIImageView(image: imageTitle)
        imageView.frame = CGRect(x: 0, y: 0, width: 40, height: 30)
        imageView.contentMode = .scaleAspectFit

        topItem?.titleView = imageView
    }
}
}

我非常喜欢这种方法,因为使用IBDesignable功能,您可以在故事板中看到它。然而,当我浏览第一个视图控制器后,我的viewcontrollers设置了tableview的方式,当我运行模拟器时,导航栏图像在所有其他视图控制器中消失。

寻找建议,看看哪种方法是最好的方法,以及如何解决我遇到的问题。或者,如果任何人有不同的方法,他们发现它有效,id喜欢看它是如何工作的!

1 个答案:

答案 0 :(得分:0)

您只需添加图片或自定义按钮,如下所示:

let button =  UIButton(type: .custom)
          button.setImage(UIImage(named: "icon_right"), for: .normal)
          button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
          button.frame = CGRect(x: 0, y: 0, width: 53, height: 31)
          button.imageEdgeInsets = UIEdgeInsetsMake(-1, 32, 1, -32)//move image to the right
          let label = UILabel(frame: CGRect(x: 3, y: 5, width: 20, height: 20))
          label.font = UIFont(name: "Arial-BoldMT", size: 16)
          label.text = "title"
          label.textAlignment = .center
          label.textColor = .black
          label.backgroundColor =  .clear
          button.addSubview(label)
          let barButton = UIBarButtonItem(customView: button)
          self.navigationItem.rightBarButtonItem = barButton