image for nav bar button item swift

前端 未结 5 1088
北荒
北荒 2020-12-14 17:41

I want to display an image in the left hand side of my nav bar in swift.

I have tried adding a nav bar button item and setting an image there.

The problem is

相关标签:
5条回答
  • 2020-12-14 18:03

    Swift 5, XCode 11 to make Navigation Bar Item with rounded image, image from assets or to download from URL.

    1) New file: UIBarButtonItem+RoundedView.swift

    import Foundation
    
    class ImageBarButton : UIView {
        var imageView: UIImageView!
        var button: UIButton!
    
        convenience init(withUrl imageURL: URL? = nil, withImage image: UIImage? = nil, frame: CGRect = CGRect(x: 0, y: 0, width: 40, height: 40)) {
            self.init(frame: frame)
    
            imageView = UIImageView(frame: frame)
            imageView.backgroundColor = .white
            imageView.layer.cornerRadius = frame.height/2
            imageView.clipsToBounds = true
            imageView.contentMode = .scaleAspectFill
            imageView.clipsToBounds = true
            addSubview(imageView)
    
            button = UIButton(frame: frame)
            button.backgroundColor = .clear
            button.setTitle("", for: .normal)
            addSubview(button)
    
            if let url = imageURL { // you can use pods like Nuke or Kingfisher 
             URLSession(configuration: .default).dataTask(with: URL(string: imageUrl)!) {[weak self] (data, response, error) in
              if let data = data , let image = UIImage(data: data) {
                  DispatchQueue.main.async {
                    self?.imgView.image = image
                  }
               }
             }.resume()
            } else if let image = image {
                self.imageView.image = image
            }
        }
    
        func load()-> UIBarButtonItem {
            return UIBarButtonItem(customView: self)
        }
    }
    

    2) Add navigation bar items, you can use navigationItem.rightBarButtonItems, navigationItem.leftBarButtonItems:

    private func initalizeNavigationBarItems() {
        let searchBarButtonView = ImageBarButton(withImage: #imageLiteral(resourceName: "greenSearchIcon")) // Assets
        searchBarButtonView.button.addTarget(self, action: #selector(presentSearchViewController), for: .touchUpInside)
    
        if let user = AccountManager.currentUser, let userProfilePictureURL = user.imageUrl { // API Url
            let profileBarButtonView = ImageBarButton(withUrl: userProfilePictureURL)
            profileBarButtonView.button.addTarget(self, action: #selector(presentMoreViewController), for: .touchUpInside)
            navigationItem.rightBarButtonItems = [searchBarButtonView.load(), profileBarButtonView.load()]
        } else {
            let profileBarButtonView = ImageBarButton(withImage: #imageLiteral(resourceName: "profileIcon"))
            profileBarButtonView.button.addTarget(self, action: #selector(presentMoreViewController), for: .touchUpInside)
            navigationItem.rightBarButtonItems = [searchBarButtonView.load(), profileBarButtonView.load()]
        }
    }
    
    @objc func presentMoreViewController(_ sender: Any) {
        // present MoreViewController
    }
    
    @objc func presentSearchViewController(_ sender: Any) {
        // present SearchViewController
    }
    

    Preview

    0 讨论(0)
  • 2020-12-14 18:04

    Use this code:

    self.navigationItem.leftBarButtonItem = nil
    
    let button = UIButton(type: .custom)
    button.setImage(UIImage (named: "ChatTab"), for: .normal)
    button.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
    //button.addTarget(target, action: nil, for: .touchUpInside)
    let barButtonItem = UIBarButtonItem(customView: button)
    
    let button2 = UIButton(type: .custom)
    button2.setImage(UIImage (named: "ActivityTab"), for: .normal)
    button2.frame = CGRect(x: 0.0, y: 0.0, width: 35.0, height: 35.0)
    //button.addTarget(target, action: nil, for: .touchUpInside)
    
    let barButtonItem2 = UIBarButtonItem(customView: button2)
    self.navigationItem.rightBarButtonItems = [barButtonItem, barButtonItem2]
    

    Output:

    0 讨论(0)
  • 2020-12-14 18:08

    Try This

    let button = UIButton(type: UIButtonType.Custom)
    button.setImage(UIImage(named: "yourImageName.png"), forState: UIControlState.Normal)
    button.addTarget(self, action:Selector("callMethod"), forControlEvents: UIControlEvents.TouchDragInside)
    button.frame=CGRectMake(0, 0, 30, 30)
    let barButton = UIBarButtonItem(customView: button)
    self.navigationItem.leftBarButtonItems = [newBackButton,barButton]
    

    For Swift 3

    let button = UIButton.init(type: .custom)
    button.setImage(UIImage.init(named: "yourImageName.png"), for: UIControlState.normal)
    button.addTarget(self, action:#selector(ViewController.callMethod), for:.touchUpInside)
    button.frame = CGRect.init(x: 0, y: 0, width: 30, height: 30) //CGRectMake(0, 0, 30, 30)
    let barButton = UIBarButtonItem.init(customView: button)
                self.navigationItem.leftBarButtonItem = barButton
    

    Swift 4

    let button = UIButton(type: UIButton.ButtonType.custom)
    button.setImage(UIImage(named: "getstarted"), for: .normal)
    button.addTarget(self, action:#selector(callMethod), for: .touchDragInside)
    button.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
    let barButton = UIBarButtonItem(customView: button)
    self.navigationItem.leftBarButtonItems = [barButton]
    

    Here is action

    @objc func callMethod() {   
        //do stuff here
     }
    
    0 讨论(0)
  • 2020-12-14 18:15

    Swift 4 and 5:

    let imageView = UIImageView(image: UIImage(named: "Harp"))
    let buttonItem = UIBarButtonItem(customView: imageView)
    self.navigationItem.leftBarButtonItem = buttonItem
    
    0 讨论(0)
  • 2020-12-14 18:15

    There is a way to use images of different sizes, depending on the device. It's called an Asset Catalog. You'll probably already have one in your project, or if not, you can add one with File > New > File > Resource > Asset Catalogue.

    Within your Asset Catalog, you can have multiple 'Image Sets' (these will be shown down the left-hand side). Add a new Image Set with the '+' at the bottom. For each Image Set, you can supply different images (e.g. of different sizes) for each of @1x, @2x, and @3x.

    Then, to use one of these images in code, you simply use UIImage(named: "name_of_image_set") - note no extension. The correct image will be loaded, depending on the device.

    Hope this helps!

    0 讨论(0)
提交回复
热议问题