ios - 在导航栏中添加图像

标签 ios swift xcode cocoa-touch swift4

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

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

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
    }
}

我在 let navController = navigationController 上不断收到“在展开可选值时意外发现 nil”!

不过,这个方法对我来说也很有效。我为 UINavigationBar 创建了一个 cocoa touch 类并使用了下面的代码:

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 函数,您可以在 Storyboard中看到它。然而,我使用表格 View 设置 View Controller 的方式,在我经过第一个 View Controller 后,当我运行模拟器时,导航栏图像会在所有其他 View Controller 中消失。

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

最佳答案

您可以简单地添加图像或自定义栏按钮,如下所示:

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

关于ios - 在导航栏中添加图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48256533/

相关文章:

ios - 从 iOS 模拟器上的应用程序崩溃中退出

带有 Ion 幻灯片的 iOS 13 中 HTML5 音频控件消失了

iOS 禁用横向 LaunchScreen.storyboard

ios - Apple Watch 配套应用本地通知延迟?

ios - 正在传递 If 语句的第一部分;可选错误

ios - 如何访问 cocoa pod 库并向其添加模块?

ios - 我想沿着半椭圆形路径移动 SKNode

ios - 找不到匹配的配置文件(有效的配置文件均不允许指定的权利)

swift - 统一的 Swift API : use of undeclared type T

iphone - 限制 UITableView 的滚动