Establecer imagen y título para el elemento de botón de barra?

Actualmente tengo un controlador de navegación personalizado con elementos de botón de barra que son simplemente botones de texto. ¿Es posible mantener el título de los elementos del botón de la barra, pero también configurarlos como imágenes (icono de la imagen + título debajo).

class NavigationController: UINavigationController { var mode: NavigationMode = .Swipe { didSet { self.setButtonAttributes() } } private var leftBarButton: UIBarButtonItem! private var middleBarButton: UIBarButtonItem! private var rightBarButton: UIBarButtonItem! private var rightBarButton2: UIBarButtonItem! override func viewDidLoad() { super.viewDidLoad() } func configureNavigationItem(navigationItem: UINavigationItem) { //Configure the bar buttons text and actions if (self.leftBarButton == nil) { self.leftBarButton = UIBarButtonItem(title: "Menu1", style: .Plain,target: self, action: "menu1Pressed:") } if (self.middleBarButton == nil) { self.middleBarButton = UIBarButtonItem(title: "Games", style: .Plain, target: self, action: "gamesPressed:") } if (self.rightBarButton == nil) { self.rightBarButton = UIBarButtonItem(title: "Menu3", style: .Plain, target: self, action: "menu3Pressed:") } if (self.rightBarButton2 == nil) { self.rightBarButton2 = UIBarButtonItem(title: "Settings", style: .Plain, target: self, action: "settingsPressed:") } self.setButtonAttributes() navigationItem.leftBarButtonItems = [self.leftBarButton, self.middleBarButton, self.rightBarButton, self.rightBarButton2] } 

Actualizado:

  let button = UIButton(type: .System) button.setImage(UIImage(named: "play"), forState: .Normal) button.setTitle("Play", forState: .Normal) button.sizeToFit() leftBarButton = UIBarButtonItem(customView: button) if (self.leftBarButton == nil) { self.leftBarButton = UIBarButtonItem(title: "Play", style: .Plain,target: self, action: "Pressed:") } 

Puede crear una instancia de UIButton, establecer una imagen y un título para ella, y luego crear su UIBarButtonItem con ella:

  let button = UIButton(type: .System) button.setImage(UIImage(named: "YourImage"), forState: .Normal) button.setTitle("YourTitle", forState: .Normal) button.sizeToFit() self.leftBarButton = UIBarButtonItem(customView: button) 

Para agregar una acción:

  button.addTarget(self, action: #selector(self.someAction), forControlEvents: .TouchUpInside) 

donde self.someAction es

 func someAction() { } 

Swift 3:

  let button = UIButton(type: .system) button.setImage(UIImage(named: "categories_icon"), for: .normal) button.setTitle("Categories", for: .normal) button.addTarget(self, action: #selector(showCategories), for: .touchUpInside) button.sizeToFit() self.navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button) 

Cree un UIButton, establezca una imagen y un título y utilícelo como imagen personalizada para UIBarButtonItem(customView:) su UIBarButtonItem(customView:) con él.

Si desea que la imagen esté en el lado derecho del botón, puede configurar semanticContentAttribute en .forceRightToLeft .

Swift 4 ejemplo:

 let view = UIView() let button = UIButton(type: .system) button.semanticContentAttribute = .forceRightToLeft button.setImage(UIImage(named: "DocumentsIcon"), for: .normal) button.setTitle("Documents", for: .normal) button.addTarget(self, action: #selector(openDocuments), for: .touchUpInside) button.sizeToFit() view.addSubview(button) view.frame = button.bounds navigationItem.rightBarButtonItem = UIBarButtonItem(customView: view)