首页 文章

Swift导航栏图像 Headers

提问于
浏览
51

几个星期前我在Swift开始编程 . 现在我想自定义我的Apps Look . 我想使用徽标图像作为导航栏 Headers 而不是明文 .

let logo = UIImage(named: "logo.png")
self.navigationItem.titleView = logo;

我收到错误 "UIImage is not convertible to UIView"

我google了很多 . 但没办法:(

11 回答

  • 2

    把它放在 UIImageView

    let logo = UIImage(named: "logo.png")
    let imageView = UIImageView(image:logo)
    self.navigationItem.titleView = imageView
    
  • 13

    这对我有用......试试吧

    let image : UIImage = UIImage(named: "LogoName")
        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
        imageView.contentMode = .scaleAspectFit
        imageView.image = image
        navigationItem.titleView = imageView
    
  • 8

    对于swift 4,您可以调整imageView大小

    let logoContainer = UIView(frame: CGRect(x: 0, y: 0, width: 270, height: 30))
    
     let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 270, height: 30))
     imageView.contentMode = .scaleAspectFit
     let image = UIImage(named: "your_image")
     imageView.image = image
     logoContainer.addSubview(imageView)
     navigationItem.titleView = logoContainer
    
  • 0

    我已经为iOS 10和iOS 11写了这个,它对我有用:

    extension UINavigationBar {
        func setupNavigationBar() {
            let titleImageWidth = frame.size.width * 0.32
            let titleImageHeight = frame.size.height * 0.64
            var navigationBarIconimageView = UIImageView()
            if #available(iOS 11.0, *) {
                navigationBarIconimageView.widthAnchor.constraint(equalToConstant: titleImageWidth).isActive = true
                navigationBarIconimageView.heightAnchor.constraint(equalToConstant: titleImageHeight).isActive = true
            } else {
                navigationBarIconimageView = UIImageView(frame: CGRect(x: 0, y: 0, width: titleImageWidth, height: titleImageHeight))
            }
            navigationBarIconimageView.contentMode = .scaleAspectFit
            navigationBarIconimageView.image = UIImage(named: "image")
            topItem?.titleView = navigationBarIconimageView
        }
    }
    
  • 9

    我用这个 . 它适用于iOS 8

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let image = UIImage(named: "YOURIMAGE")
        navigationItem.titleView = UIImageView(image: image)
    }
    

    以下是一个如何使用CGRect实现的示例 .

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 38, height: 38))
        imageView.contentMode = .ScaleAspectFit
        let image = UIImage(named: "YOURIMAGE")
        imageView.image = image
        navigationItem.titleView = imageView
    }
    

    希望这会有所帮助 .

  • 0

    这在2015年9月对我有用 - 希望这可以帮助那里的人 .

    // 1
        var nav = self.navigationController?.navigationBar
        // 2 set the style 
        nav?.barStyle = UIBarStyle.Black
        nav?.tintColor = UIColor.yellowColor()
        // 3
        let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
        imageView.contentMode = .ScaleAspectFit
        // 4
        let image = UIImage(named: "logo.png")
        imageView.image = image
        // 5
        navigationItem.titleView = imageView
    
  • 2

    让我们试试看看

    let image = UIImage(named: "Navbar_bg.png")
    navigationItem.titleView = UIImageView(image: image)
    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 40, height: 40))
    imageView.contentMode = .ScaleAspectFit
    
  • 5

    我在上面尝试了@Jack的答案,但是徽标确实出现了,但是图像占据了整个导航栏 . 我希望它适合 .

    Swift 4, Xcode 9.2

    1.为导航控制器,UIImage赋值 . 通过分割帧和图像大小来调整大小 .

    func addNavBarImage() {
    
            let navController = navigationController!
    
            let image = UIImage(named: "logo-signIn6.png") //Your logo url here
            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
        }
    
    • viewDidLoad() 下添加功能
    addNavBarImage()
    

    关于图像资产的注意事项 . 在上传之前,我使用额外的边距调整徽标,而不是在边缘裁剪 .

    最后结果:

  • 0

    如果您更喜欢使用自动布局,并希望导航栏中的永久固定图像不会在每个屏幕中生成动画,则此解决方案效果很好:

    class CustomTitleNavigationController: UINavigationController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        let logo = UIImage(named: "MyHeaderImage")
    
        let imageView = UIImageView(image:logo)
        imageView.contentMode = .scaleAspectFit
        imageView.translatesAutoresizingMaskIntoConstraints = false
    
        navigationBar.addSubview(imageView)
    
        navigationBar.addConstraint (navigationBar.leftAnchor.constraint(equalTo: imageView.leftAnchor, constant: 0))
        navigationBar.addConstraint (navigationBar.rightAnchor.constraint(equalTo: imageView.rightAnchor, constant: 0))
        navigationBar.addConstraint (navigationBar.topAnchor.constraint(equalTo: imageView.topAnchor, constant: 0))
        navigationBar.addConstraint (navigationBar.bottomAnchor.constraint(equalTo: imageView.bottomAnchor, constant: 0))
    }
    
  • 126

    您可以使用自定义UINavigationItem,因此您只需要在Main.storyboard上将“Navigation Item”更改为YourCustomClass .

    In Swift 3

    class FixedImageNavigationItem: UINavigationItem {
    
    private let fixedImage : UIImage = UIImage(named: "your-header-logo.png")!
    private let imageView : UIImageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 37.5))
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        imageView.contentMode = .scaleAspectFit
        imageView.image = fixedImage
        self.titleView = imageView
    
    }
    
    }
    
  • 43

    适用于我的快速4(方形图像40x40)

    let imageView = UIImageView()
            imageView.frame.size.width = 40
            imageView.frame.size.height = 40
            imageView.contentMode = .scaleAspectFit
            let image = UIImage(named: "YOUR_IMAGE_NAME")
            imageView.image = image
            navigationItem.titleView = imageView
    

    如果您想要其他措施,请尝试

    let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 100.5)))
                imageView.contentMode = .scaleAspectFit
                let image = UIImage(named: "YOUR_IMAGE_NAME")
                imageView.image = image
                navigationItem.titleView = imageView
    

    我希望它能为你服务 . 这个对我有用 .

相关问题