Sekme çubuğu öğe metnini kaldır, yalnızca resmi göster


90

Basit soru, sekme çubuğu öğesi metnini nasıl kaldırabilirim ve yalnızca resmi gösterebilirim?

Çubuk öğelerinin instagram uygulamasında beğenilmesini istiyorum:

görüntü açıklamasını buraya girin

Xcode 6'daki denetçide başlığı kaldırıyorum ve bir @ 2x (50px) ve bir @ 3x (75px) resim seçiyorum. Ancak görüntü, kaldırılan metnin boş alanını kullanmaz. İnstagram uygulamasında olduğu gibi aynı sekme çubuğu öğesi görüntüsünün nasıl elde edileceğine dair bir fikriniz var mı?



1
""başlık için kullanmak , belki?
holex

1
Ofsetleri ayarlamak sadece bir hiledir, doğru cevap biraz aşağıdadır. NavigationItem.title = "some title" kullanmalısınız
Davit Siradeghyan

Yanıtlar:


131

imageInsetsMülkiyetiyle oynamalısınız UITabBarItem. İşte örnek kod:

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

İçerideki değerler UIEdgeInsetsresminizin boyutuna bağlıdır. İşte o kodun uygulamamdaki sonucu:

görüntü açıklamasını buraya girin


25
Denetçideki görüntü eklerini de ayarlayabilirsiniz.
2014

Sihirli sayılar kötü bir fikirdir. Aynı şeyi başarmanın evrensel olarak uyumlu bir yolu için lütfen cevabıma bakın.
Ezekiel Victor

4
Bu artık iOS 11'de çalışmıyor - etkin sekmeyi çift tıklarsanız, bir nedenden ötürü ekleri ikiye katlar.
Ben Gotow

@BenGotow aynı problemin herhangi bir çözümü var mı?
Dixit Akabari

@DixitAkabari diğer insanlar iOS 11 için bazı iyi çözümler yayınladılar
Pranav Kasetti

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
Başlığı kaldırmak yerine, metin rengini temizlemek için değiştirin. Başlık faydalı olabilir.
Eduardo Mauro

1
Kodos'tan Eduardo'ya! İyi bir seçeneğin, öğenin başlığına dikey bir UIOffset ayarlamak olduğunu fark ettim KonumAyar
Julius

2
Bunu özel TabBar Denetleyicinizde nereye koyuyorsunuz?
UKDataGeek

69

İşte bir film şeridinde bunu nasıl yapacağınız.

Başlık metnini temizleyin ve resim ekini aşağıdaki ekran görüntüsü gibi ayarlayın

görüntü açıklamasını buraya girin

Simge boyutunun elma tasarım kılavuzuna uygun olması gerektiğini unutmayın

görüntü açıklamasını buraya girin

Bu, @ 1x için 25px x 25px, @ 2x için 50px x 50px, @ 3x için 75px x 75px olması gerektiği anlamına gelir


47

Görünüm denetleyicisinde ayarlanmışsa, her bir UITabBarItems titleözelliğini "" ve güncellemesini ayarlayarak yaklaşımı kullanmak imageInsetsdüzgün çalışmayacaktır self.title. Örneğin self.viewControllers, UITabBarController'a gömülü ise UINavigationControllerve gezinme çubuğunda görüntülenecek başlığa ihtiyacınız varsa. Bu durumda UINavigationItembaşlığı doğrudan kullanarak ayarlayın self.navigationItem.title, değil self.title.


2
Bu çok daha temiz bir yöntem gibi görünüyor. +1 @Oleg bu yanıt olarak işaretlenmelidir.
akseli

29

Ddiego cevabının hızlı versiyonu

İOS 11 ile uyumlu

ViewController başlığını ayarladıktan sonra, viewControllers öğesinin her ilk alt öğesinin viewDidLoad öğesinde bu işlevi çağırın

En iyi pratik:

@Daspianist'in yorumlarda önerdiği gibi Alternativelly

Bu sınıf BaseTabBarController: UITabBarController, UITabBarControllerDelegate gibi bir alt sınıf oluşturun ve bu işlevi alt sınıfın viewDidLoad öğesine yerleştirin

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
Harika işlev! Alternatif olarak bunun gibi bir alt sınıf oluşturabilir class BaseTabBarController: UITabBarController, UITabBarControllerDelegateve bu işlevi alt sınıfınviewDidLoad
daspianist'e koyabilirsiniz

26

Film şeridi kullanıyorsanız, bu en iyi seçenek olacaktır. Tüm sekme çubuğu öğeleri arasında döngü oluşturur ve her biri için başlığı sıfır olarak ayarlar ve görüntüyü tam ekran yapar. (Film şeridine bir resim eklemiş olmalısınız)

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

Hem üst hem de alt girintileri ayarlamazsanız görüntünün çarpıtılacağını unutmayın.
Julius

16

iOS 11, bu çözümlerin çoğunda bir karışıklık yaratıyor, bu yüzden iOS 11'deki sorunlarımı UITabBar'ı alt sınıflara ayırarak ve layoutSubviews'leri geçersiz kılarak düzelttim.

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

bu benim için işe yarayan tek şeydi ancak kodu MyTabBarController alt sınıfının 'override func viewDidLayoutSubviews' içine koymak zorunda kaldım. TabBarController'ın alt sınıfını oluşturdum ve adını şöyle adlandırdım
Lance Samaria

Çözüm benim için iyi çalıştı. Uzantı olarak kullandım, bu yüzden eklemek daha kolay
Michal Gumny

@LanceSamaria bu, sekme barkodu koduna dokunmam gerekmeden çalıştı
Pranav Kasetti

12

BaseTabBarController'ın viewDidLoad'unda aşağıdaki kodu kullandım. Örneğimde 5 sekmem olduğunu ve seçilen resmin her zaman base_image + "_selected" olacağını unutmayın.

// 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
Kullanmak yerine for var i = 0; i < tabBar... şöyle diyebilirdiniz; for tabBarItems in tabBar.items!
Jesse Onolemen

10

Swift 4 yaklaşımı

TabBarItem'i alan ve ona biraz biçimlendirme yapan bir işlevi uygulayarak hile yapabildim.

Görüntüyü daha ortalamak için biraz aşağı taşır ve ayrıca Sekme Çubuğunun metnini gizler. Başlığını boş bir dizeye ayarlamaktan daha iyi çalıştı, çünkü bir NavigationBar'ınız olduğunda da TabBar seçildiğinde viewController'ın başlığını geri alıyor

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

En son sözdizimi

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

Ve bunu sekme çubuğunuzda şu şekilde kullanın:

tabBarItem.setImageOnly()

6

İşte bunu yapmanın en iyi cevaptan başka daha iyi ve daha kusursuz bir yolu:

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

Senin bu koy AppDelegate.didFinishLaunchingWithOptionssenin, uygulamanın ömrü boyunca tüm sekme çubuğu düğmeleri etkiler böylece.


3
Bu yalnızca başlığı gizler ve resmin konumunu ayarlamaz.
mustafa

2
Evet ama soru görüntüyü ayarlamakla ilgili hiçbir şey söylemedi. Sadece metni gizlemek. Ve metni bir görünüm denetleyicisinden kaldırmanın zararına iyi gizlemek yanlış görünüyor. Özellikle bu başlığı navigasyon
görüntü denetleyicinizin bir

6

Bir minimal, güvenli UITabBarController uzatma Swift (dayanan @ korgx9 yanıt):

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

2

Dayanarak ddiego cevabında içinde, 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)
        }
    }
}

Ve sadece self.tabBarController?.cleanTitles()görünüm denetleyicinizi aramanız gerekir .


1

Bu sayfadaki tüm harika cevaplara dayanarak, başlığı tekrar göstermenize de izin veren başka bir çözüm geliştirdim. Başlık içeriğini kaldırmak yerine yazı tipi rengini şeffaf olarak değiştiriyorum.

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

görüntü açıklamasını buraya girin

kod:

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

0

En kolay yol ve her zaman işe yarar:

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

Benim durumumda, aynı ViewController TabBar'da ve diğer gezinme akışında kullanıldı. ViewController'imin içinde, sekme çubuğuna eklerken self.title = "Some Title"başlığı nilveya boşluğu ayarlamadan TabBar'da görüneni ayarladım . Ayrıca imageInsetsaşağıdaki gibi belirledim :

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

Bu yüzden, ViewController'imin içinde gezinme başlığını şu şekilde ele aldım:

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'ın bir alt sınıfını yapın ve bunu tabBar'ınıza atayın, ardından viewDidLoad yöntemine şu kod satırını yerleştirin:

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

0

Özel TabBar - iOS 13, Swift 5, XCode 11

  • Metinsiz TabBar öğeleri
  • Dikey olarak ortalanmış TabBar öğeleri
  • Yuvarlak TabBar görünümü
  • TabBar Dinamik konumu ve çerçeveler

Storyboard tabanlı. Programlı olarak da kolaylıkla elde edilebilir. İzlenecek yalnızca 4 Adım:

  1. Sekme Çubuğu Simgeleri 3 boyutta ve siyah renkte olmalıdır. Genellikle fa2png.io'dan indiriyorum - boyutlar: 25x25, 50x50, 75x75. PDF görüntü dosyaları çalışmıyor!

    görüntü açıklamasını buraya girin

  2. Sekme çubuğu öğesi için Storyboard'da, Attributes Inspector aracılığıyla kullanmak istediğiniz simgeyi ayarlayın. (ekran görüntüsüne bakın)

görüntü açıklamasını buraya girin

  1. Özel TabBarController -> Yeni Dosya -> Tür: UITabBarController -> Film şeridinde ayarla. (ekran görüntüsüne bakın)

görüntü açıklamasını buraya girin

  1. UITabBarController sınıfı

    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. Sonuç görüntü açıklamasını buraya girin


0

Sihirli numaralar kullanmadan sekmeleri ortalamak / görüntü girişlerini değiştirmek istiyorsanız, aşağıdakiler benim için çalıştı (Swift 5.2.2'de):

Bir UITabBarController alt sınıfında, görünüm denetleyicilerini ayarladıktan sonra görüntü girintilerini ekleyebilirsiniz.

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

Yukarıdaki seçeneklerden birkaçı, metni gizlemekle ilgili çözümleri listelemektedir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.