Видалити текст елемента на панелі вкладок, показати лише зображення


90

Просте запитання, як я можу видалити текст елемента панелі вкладок і показати лише зображення?

Я хочу, щоб елементи панелі сподобалися в програмі instagram:

введіть тут опис зображення

В інспекторі в xcode 6 я видаляю заголовок і вибираю зображення @ 2x (50px) та @ 3x (75px). Однак зображення не використовує вільний простір видаленого тексту. Будь-які ідеї, як отримати те саме зображення елемента на панелі вкладок, як у програмі instagram?



1
використовуючи ""для заголовка, можливо?
holex

1
Встановлення компенсацій - це просто фокус, правильна відповідь трохи нижче. Вам слід використовувати navigationItem.title = "деякий заголовок"
Давіт Сірадегян

Відповіді:


129

Вам слід грати з imageInsetsвластивістю UITabBarItem. Ось зразок коду:

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

Значення всередині UIEdgeInsetsзалежать від розміру вашого зображення. Ось результат цього коду в моєму додатку:

введіть тут опис зображення


25
Ви також можете налаштувати вставки зображення в інспекторі.
Проголосувати

Чарівні числа - погана ідея. Будь ласка, перегляньте мою відповідь щодо універсально сумісного способу досягнення того самого.
Єзекіїль Віктор

4
Це більше не працює в iOS 11 - якщо ви двічі клацнете активну вкладку, вона з якихось причин подвоїть вставки.
Бен Готов

@BenGotow та сама проблема, у вас є якесь рішення?
Діксіт Акабарі

Інші люди @DixitAkabari вже опублікували кілька хороших рішень для iOS 11
Пранав Касетті

78
// 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
Замість видалення заголовка змініть колір тексту на чистий. Заголовок може бути корисним.
Едуардо Мауро

1
Кодос Едуардо! Змусив мене зрозуміти, що хорошим варіантом є також встановити вертикальний UIO-зсув для заголовка елемента ПозиціяРегулювання
Юлій

2
Куди ви поміщаєте це у своєму користувацькому контролері TabBar?
UKDataGeek

69

Ось як ви це робите в раскадровці.

Очистіть текст заголовка та встановіть вставку зображення, як на скріншоті нижче

введіть тут опис зображення

Пам'ятайте, розмір піктограм повинен відповідати рекомендаціям щодо дизайну яблук

введіть тут опис зображення

Це означає, що у вас повинно бути 25 пікселів х 25 пікселів для @ 1x, 50 пікселів x 50 пікселів для @ 2x, 75 пікселів x 75 пікселів для @ 3x


45

Використання підходу при встановленні для кожного UITabBarItems titleвластивості "" та оновлення imageInsetsне працюватиме належним чином, якщо self.titleвстановлено контролер подання . Наприклад, якщо self.viewControllersвбудовано UITabBarController, UINavigationControllerі вам потрібно, щоб заголовок відображався на панелі навігації. У цьому випадку встановіть UINavigationItemзаголовок s безпосередньо, використовуючи self.navigationItem.title, а не self.title.


2
Це здається способом чистішого способу. +1 @ Олег це слід позначити як відповідь.
akseli

29

Швидка версія відповіді ddiego

Сумісний з iOS 11

Викличте цю функцію в viewDidLoad кожної першої дочірньої частини viewControllers після встановлення заголовка viewController

Найкраща практика:

Альтернативно, як запропонував @daspianist у коментарях

Створіть підклас подібного до цього класу BaseTabBarController: UITabBarController, UITabBarControllerDelegate і помістіть цю функцію в viewDidLoad підкласу

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
Чудова функція! Ви можете альтернативно зробити такий підклас, як цей, class BaseTabBarController: UITabBarController, UITabBarControllerDelegateі помістити цю функцію в підкласviewDidLoad
daspianist

26

Якщо ви використовуєте розкадровки, це був би найкращий варіант. Він перебирає всі елементи панелі вкладок і для кожного з них встановлює заголовок на нуль і робить зображення на весь екран. (Ви повинні додати зображення в розкадрування)

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

Варто зазначити, що якщо ви не встановите як верхні, так і нижні вставки, зображення в кінцевому підсумку буде деформованим.
Юлій

16

iOS 11 викликає перелом у багатьох із цих рішень, тому я щойно вирішив свої проблеми на iOS 11, підкласувавши UITabBar та замінивши 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
        }
    }
}

це єдине, що працювало у мене, але мені довелося помістити код всередину "перевизначити func viewDidLayoutSubviews" підкласу MyTabBarController. Я зробив підклас tabBarController і назвав його таким
Lance Samaria

Рішення для мене працювало приємно. Я використав його як розширення, щоб його було простіше додати
Michal Gumny

@LanceSamaria це спрацювало, і мені не потрібно було торкатися коду контролера панелі вкладок
Пранав Касетті,

12

Я використав наступний код у моєму BaseTabBarController viewDidLoad. Зверніть увагу, що в моєму прикладі у мене є 5 вкладок, і вибране зображення завжди буде 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
Замість того, щоб використовувати for var i = 0; i < tabBar... , ви могли б просто сказати; for tabBarItems in tabBar.items!
Джессі Онолемен,

10

Стрімкий підхід 4

Я зміг зробити фокус, реалізувавши функцію, яка бере TabBarItem і виконує деяке форматування.

Переміщує зображення трохи вниз, щоб зробити його більш центрованим, а також приховує текст панелі вкладок. Працювало краще, ніж просто встановити для заголовка порожній рядок, тому що коли у вас також є панель навігації, панель табуляцій повертає заголовок viewController при виборі

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

Останній синтаксис

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

І просто використовуйте його у вкладці tabBar як:

tabBarItem.setImageOnly()

6

Ось кращий, надійніший спосіб зробити це, крім верхньої відповіді:

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

Помістіть це у свій, AppDelegate.didFinishLaunchingWithOptionsщоб воно впливало на всі кнопки панелі вкладок протягом усього життя вашого додатка.


3
Це лише приховує заголовок і не коригує положення зображення.
mustafa

2
Так, але питання нічого не говорило про коригування зображення. Просто приховуючи текст. І добре приховувати текст на шкоду видаленню заголовка з контролера перегляду здається неправильним. Особливо тоді, коли ви могли б використовувати цей заголовок, щоб показати його як частину свого
контролера

6

Мінімальне, безпечне розширення UITabBarController у Swift (на основі відповіді @ korgx9):

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

2

На основі відповіді ddiego у 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)
        }
    }
}

І вам просто потрібно зателефонувати self.tabBarController?.cleanTitles()у свій контролер перегляду.


1

На основі всіх чудових відповідей на цій сторінці я створив ще одне рішення, яке також дозволяє вам знову показати заголовок. Замість того, щоб видалити вміст заголовка, я просто змінюю колір шрифту на прозорий.

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

введіть тут опис зображення

код:

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

0

Найпростіший спосіб і завжди працює:

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

У моєму випадку той самий ViewController використовувався в TabBar та інших потоках навігації. Усередині мого ViewController я встановив, self.title = "Some Title"що відображається в TabBar, незалежно від встановленого заголовка nilчи порожнього, додаючи його на панелі вкладок. Я також встановив imageInsetsнаступне:

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

Тож у моєму ViewController я обробив назву навігації наступним чином:

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

зробіть підклас UITabBarController і призначте його для своєї tabBar, а потім у методі viewDidLoad помістіть цей рядок коду:

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

0

Спеціальна вкладка - iOS 13, Swift 5, XCode 11

  • Елементи TabBar без тексту
  • Елементи TabBar по центру вертикально
  • Вид закругленої вкладки
  • TabBar Динамічне положення та кадри

На основі розкадровки. Цього також легко досягти програмно. Тільки 4 кроки для виконання:

  1. Значки панелі вкладок мають бути 3-х розмірів, чорного кольору. Зазвичай я завантажую з fa2png.io - розміри: 25x25, 50x50, 75x75. Файли зображень PDF не працюють!

    введіть тут опис зображення

  2. У розкадруванні для елемента панелі вкладок встановіть піктограму, яку ви хочете використовувати за допомогою інспектора атрибутів. (див. скріншот)

введіть тут опис зображення

  1. Спеціальний TabBarController -> Новий файл -> Тип: UITabBarController -> Встановити на розкадруванні. (див. скріншот)

введіть тут опис зображення

  1. Клас UITabBarController

    клас 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. Результат введіть тут опис зображення


0

Якщо ви хочете відцентрувати вкладки / змінити вставки зображення, не використовуючи магічні цифри, мені допомогло наступне (у Swift 5.2.2):

У підкласі UITabBarController ви можете додати додавання вкладених зображень після встановлення контролерів подання.

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

Кілька варіантів, наведених вище, наводять рішення для приховування тексту.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.