Remover texto do item da barra de guias, mostrar apenas imagem


89

Uma pergunta simples, como posso remover o texto do item da barra de guias e mostrar apenas a imagem?

Quero que os itens da barra gostem no aplicativo Instagram:

insira a descrição da imagem aqui

No inspetor no xcode 6, removo o título e escolho uma imagem @ 2x (50px) e @ 3x (75px). No entanto, a imagem não usa o espaço livre do texto removido. Alguma ideia de como obter a mesma imagem de item da barra de guias como no aplicativo instagram?



1
usando ""para o título, talvez?
— holex de

1
Definir offsets é apenas um truque, a resposta correta está um pouco abaixo. Você deve usar navigationItem.title = "algum título"
— Davit Siradeghyan

Respostas:


129

Você deve jogar com imageInsetspropriedade de UITabBarItem. Aqui está o código de amostra:

let tabBarItem = UITabBarItem(title: nil, image: UIImage(named: "more")
tabBarItem.imageInsets = UIEdgeInsets(top: 9, left: 0, bottom: -9, right: 0)

Os valores internos UIEdgeInsetsdependem do tamanho da imagem. Aqui está o resultado desse código em meu aplicativo:

insira a descrição da imagem aqui


25
Você também pode ajustar as inserções de imagem no inspetor.
— voto positivo

Números mágicos são uma má ideia. Por favor, veja minha resposta para uma maneira universalmente compatível de realizar a mesma coisa.
— Ezekiel Victor

4
Isso não funciona mais no iOS 11 - se você clicar duas vezes na guia ativa, as inserções dobrarão por algum motivo.
— Ben Gotow

@BenGotow mesmo problema você tem alguma solução?
— Dixit Akabari

@DixitAkabari outras pessoas já postaram algumas boas soluções para iOS 11
— Pranav Kasetti

77
// Remove the titles and adjust the inset to account for missing title
for(UITabBarItem * tabBarItem in self.tabBar.items){
    tabBarItem.title = @"";
    tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
}

1
Em vez de remover o título, altere a cor do texto para limpar. O título pode ser útil.
— Eduardo Mauro

1
Kodos para Eduardo! Me fez perceber que uma boa opção também é definir um UIOffset vertical no título do itemPositionAjustement
— Julius

2
Onde você coloca isso em seu controlador TabBar personalizado?
— UKDataGeek

69

Aqui está como você faz isso em um storyboard.

Limpe o texto do título e defina a inserção da imagem como a imagem abaixo

insira a descrição da imagem aqui

Lembre-se de que o tamanho do ícone deve seguir as diretrizes de design da apple

insira a descrição da imagem aqui

Isso significa que você deve ter 25px x 25px para @ 1x, 50px x 50px para @ 2x, 75px x 75px para @ 3x


45

Usar a abordagem com a definição de cada propriedade UITabBarItems titlepara "" e atualização imageInsetsnão funcionará corretamente se o controlador de visualização self.titleestiver definido. Por exemplo, se self.viewControllersUITabBarController estiverem incorporados UINavigationControllere você precisar que o título seja exibido na barra de navegação. Neste caso, defina UINavigationItemo título diretamente usando self.navigationItem.title, não self.title.


2
Este parece ser um método mais limpo. +1 @Oleg isso deve ser marcado como a resposta.
— akseli de

29

Versão rápida da resposta ddiego

Compatível com iOS 11

Chame esta função em viewDidLoad de cada primeiro filho dos viewControllers após definir o título do viewController

Melhor prática:

Alternativamente como @daspianist sugerido nos comentários

Faça uma subclasse como esta classe BaseTabBarController: UITabBarController, UITabBarControllerDelegate e coloque esta função no viewDidLoad da subclasse

func removeTabbarItemsText() {

    var offset: CGFloat = 6.0

    if #available(iOS 11.0, *), traitCollection.horizontalSizeClass == .regular {
        offset = 0.0
    }

    if let items = tabBar.items {
        for item in items {
            item.title = ""
            item.imageInsets = UIEdgeInsets(top: offset, left: 0, bottom: -offset, right: 0)
        }
    }
}

2
Excelente função! Você poderia, alternativamente, fazer uma subclasse de assim class BaseTabBarController: UITabBarController, UITabBarControllerDelegatee colocar essa função na subclasseviewDidLoad
— daspianista de

26

Se você estiver usando storyboards, esta seria sua melhor opção. Ele percorre todos os itens da barra de guias e para cada um deles define o título como nada e torna a imagem em tela inteira. (Você deve ter adicionado uma imagem no storyboard)

for tabBarItem in tabBar.items!
{
   tabBarItem.title = ""
   tabBarItem.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0)
}

É bom notar que, se você não definir as inserções superior e inferior, a imagem ficará distorcida.
— Julius

16

O iOS 11 atrapalha muitas dessas soluções, então resolvi apenas meus problemas no iOS 11 criando uma subclasse de UITabBar e substituindo layoutSubviews.

class MainTabBar: UITabBar {

    override func layoutSubviews() {
        super.layoutSubviews()

        // iOS 11: puts the titles to the right of image for horizontal size class regular. Only want offset when compact.
        // iOS 9 & 10: always puts titles under the image. Always want offset.
        var verticalOffset: CGFloat = 6.0

        if #available(iOS 11.0, *), traitCollection.horizontalSizeClass == .regular {
            verticalOffset = 0.0
        }

        let imageInset = UIEdgeInsets(
            top: verticalOffset,
            left: 0.0,
            bottom: -verticalOffset,
            right: 0.0
        )

        for tabBarItem in items ?? [] {
            tabBarItem.title = ""
            tabBarItem.imageInsets = imageInset
        }
    }
}

esta é a única coisa que funcionou para mim, mas eu tive que colocar o código dentro de 'override func viewDidLayoutSubviews' da subclasse de MyTabBarController. Criei uma subclasse de tabBarController e chamei-o assim
— Lance Samaria,

A solução funcionou bem para mim. Usei-o como extensão, então é mais simples de adicionar
— Michal Gumny

@LanceSamaria isso funcionou sem que eu precisasse tocar na guia do código do controlador de barras
— Pranav Kasetti

12

Usei o seguinte código no viewDidLoad do meu BaseTabBarController. Observe que no meu exemplo, eu tenho 5 guias, e a imagem selecionada sempre será base_image + "_selected".

// Get tab bar and set base styles
let tabBar = self.tabBar;
tabBar.backgroundColor = UIColor.whiteColor()

// Without this, images can extend off top of tab bar
tabBar.clipsToBounds = true

// For each tab item..
let tabBarItems = tabBar.items?.count ?? 0
for i in 0 ..< tabBarItems {
    let tabBarItem = tabBar.items?[i] as UITabBarItem

    // Adjust tab images (Like mstysf says, these values will vary)
    tabBarItem.imageInsets = UIEdgeInsetsMake(5, 0, -6, 0);

    // Let's find and set the icon's default and selected states
    // (use your own image names here)
    var imageName = ""
    switch (i) {
    case 0: imageName = "tab_item_feature_1"
    case 1: imageName = "tab_item_feature_2"
    case 2: imageName = "tab_item_feature_3"
    case 3: imageName = "tab_item_feature_4"
    case 4: imageName = "tab_item_feature_5"
    default: break
    }
    tabBarItem.image = UIImage(named:imageName)!.imageWithRenderingMode(.AlwaysOriginal)
    tabBarItem.selectedImage = UIImage(named:imageName + "_selected")!.imageWithRenderingMode(.AlwaysOriginal)
}

1
Em vez de usar for var i = 0; i < tabBar... , você poderia apenas ter dito; for tabBarItems in tabBar.items!
— Jesse Onolemen de

10

Abordagem Swift 4

Consegui fazer o truque implementando uma função que pega um TabBarItem e faz alguma formatação nele.

Move a imagem um pouco para baixo para torná-la mais centralizada e também oculta o texto da Barra de guias. Funcionou melhor do que apenas definir seu título como uma string vazia, porque quando você tem uma NavigationBar também, a TabBar recupera o título do viewController quando selecionada

func formatTabBarItem(tabBarItem: UITabBarItem){
    tabBarItem.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
    tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .selected)
    tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.clear], for: .normal)
}

Sintaxe mais recente

extension UITabBarItem {
    func setImageOnly(){
        imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
        setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.clear], for: .selected)
        setTitleTextAttributes([NSAttributedString.Key.foregroundColor:UIColor.clear], for: .normal)
    }
 }

E basta usá-lo em sua barra de tabulação como:

tabBarItem.setImageOnly()

6

Aqui está uma maneira melhor e mais segura de fazer isso, além da resposta principal:

[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]}
                                         forState:UIControlStateNormal];
[[UITabBarItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColor clearColor]}
                                         forState:UIControlStateHighlighted];

Coloque-o em seu AppDelegate.didFinishLaunchingWithOptionspara que afete todos os botões da barra de guias ao longo da vida de seu aplicativo.


3
Isso apenas oculta o título e não ajusta a posição da imagem.
— mustafa

2
Sim, mas a pergunta não dizia nada sobre como ajustar a imagem. Apenas escondendo o texto. E esconder bem o texto em detrimento de remover o título de um controlador de visualização parece errado. Especialmente quando você poderia usar esse título para mostrá-lo como parte de seu
— controle de

6

Uma extensão UITabBarController mínima e segura em Swift (com base na resposta @ korgx9):

extension UITabBarController {
  func removeTabbarItemsText() {
    tabBar.items?.forEach {
      $0.title = ""
      $0.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
    }
  }
}

2

Com base na resposta do ddiego , no Swift 4.2 :

extension UITabBarController {
    func cleanTitles() {
        guard let items = self.tabBar.items else {
            return
        }
        for item in items {
            item.title = ""
            item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
        }
    }
}

E você só precisa chamar self.tabBarController?.cleanTitles()seu controlador de visualização.


1

Com base em todas as ótimas respostas desta página, criei outra solução que também permite que você mostre o título novamente. Em vez de remover o conteúdo do título, apenas altero a cor da fonte para transparente.

extension UITabBarItem {

    func setTitleColorFor(normalState: UIColor, selectedState: UIColor) {
        self.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: normalState], for: .normal)
        self.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: selectedState], for: .selected)
    }

}


extension UITabBarController {

    func hideItemsTitle() {

        guard let items = self.tabBar.items else {
            return
        }

        for item in items {
            item.setTitleColorFor(normalState: UIColor(white: 0, alpha: 0), selectedState: UIColor(white: 0, alpha: 0))
            item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)
        }

    }

    func showItemsTitle() {

        guard let items = self.tabBar.items else {
            return
        }

        for item in items {
            item.setTitleColorFor(normalState: .black, selectedState: .yellow)
            item.imageInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
        }

    }

}

0

insira a descrição da imagem aqui

código:

private func removeText() {
    if let items = yourTabBarVC?.tabBar.items {
       for item in items {
          item.title = ""
       }
    }
 }

0

Maneira mais fácil e sempre funciona:

class TabBar: UITabBar {

    override func layoutSubviews() {
        super.layoutSubviews()

        subviews.forEach { subview in
            if subview is UIControl {
                subview.subviews.forEach {
                    if $0 is UILabel {
                        $0.isHidden = true
                        subview.frame.origin.y = $0.frame.height / 2.0
                    }
                }
            }
        }
    }
}

0

No meu caso, o mesmo ViewController foi usado no TabBar e outro fluxo de navegação. Dentro do meu ViewController, eu defini o self.title = "Some Title"que estava aparecendo no TabBar independentemente da configuração do título nilou em branco ao adicioná-lo na barra de guias. Eu também defini imageInsetso seguinte:

item.imageInsets = UIEdgeInsets(top: 6, left: 0, bottom: -6, right: 0)

Portanto, dentro do meu ViewController, tratei do título de navegação da seguinte maneira:

if isFromTabBar {
   // Title for NavigationBar when ViewController is added in TabBar
   // NOTE: Do not set self.title = "Some Title" here as it will set title of tabBarItem
   self.navigationItem.title = "Some Title"
} else {
   // Title for NavigationBar when ViewController is opened from navigation flow
   self.title = "Some Title"
}

0

faça uma subclasse de UITabBarController e atribua-a ao seu tabBar, em seguida, no método viewDidLoad coloque esta linha de código:

tabBar.items?.forEach({ (item) in
        item.imageInsets = UIEdgeInsets.init(top: 8, left: 0, bottom: -8, right: 0)
    })

0

TabBar personalizado - iOS 13, Swift 5, XCode 11

  • Itens TabBar sem texto
  • Itens TabBar centralizados verticalmente
  • Vista de TabBar arredondada
  • Posição dinâmica TabBar e frames

Baseado em storyboard. Também pode ser alcançado facilmente de forma programática. Apenas 4 etapas a seguir:

  1. Os ícones da barra de guias devem ter 3 tamanhos, na cor preta. Normalmente, eu faço download em fa2png.io - tamanhos: 25x25, 50x50, 75x75. Os arquivos de imagem PDF não funcionam!

    insira a descrição da imagem aqui

  2. No Storyboard para o item da barra de guias, defina o ícone que deseja usar por meio do Attributes Inspector. (veja a imagem)

insira a descrição da imagem aqui

  1. TabBarController personalizado -> Novo arquivo -> Tipo: UITabBarController -> Definir no storyboard. (veja a imagem)

insira a descrição da imagem aqui

  1. Classe UITabBarController

    class RoundedTabBarViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()
    
        // Do any additional setup after loading the view.
        // Custom tab bar view
        customizeTabBarView()
    }
    
    private func customizeTabBarView() {
        let tabBarHeight = tabBar.frame.size.height
        self.tabBar.layer.masksToBounds = true
        self.tabBar.isTranslucent = true
        self.tabBar.barStyle = .default
        self.tabBar.layer.cornerRadius = tabBarHeight/2
        self.tabBar.layer.maskedCorners = [.layerMaxXMaxYCorner, .layerMaxXMinYCorner, .layerMinXMaxYCorner, .layerMinXMinYCorner]
    }
    
    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let viewWidth = self.view.bounds.width
        let leadingTrailingSpace = viewWidth * 0.05
    
        tabBar.frame = CGRect(x: leadingTrailingSpace, y: 200, width: viewWidth - (2 * leadingTrailingSpace), height: 49)
    }

    }

  2. Resultado insira a descrição da imagem aqui


0

Se você está olhando para centralizar as guias / alterar as inserções de imagem sem usar números mágicos, o seguinte funcionou para mim (no Swift 5.2.2):

Em uma subclasse UITabBarController , você pode adicionar as inserções de imagem após definir os controladores de visualização.

override var viewControllers: [UIViewController]? {
    didSet {
      addImageInsets()
    }
}

func addImageInsets() {
    let tabBarHeight = tabBar.frame.height

    for item in tabBar.items ?? [] where item.image != nil {
      let imageHeight = item.image?.size.height ?? 0
      let inset = CGFloat(Int((tabBarHeight - imageHeight) / 4))
      item.imageInsets = UIEdgeInsets(top: inset,
                                      left: 0,
                                      bottom: -inset,
                                      right: 0)
    }
}

Várias das opções acima listam soluções para lidar com a ocultação do texto.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.