Можно ли удалить изображения в UITabBarItem и выровнять заголовок по вертикали

У меня есть UITabBar, но я не хочу устанавливать изображения, я просто хочу установить заголовок, и я хочу, чтобы этот заголовок был выровнен по вертикали. Это возможно?

Спасибо


person Pach    schedule 28.06.2012    source источник


Ответы (3)


Не то, что я знаю о. Я думаю, вам нужно будет создать изображения ваших текстовых меток (либо заранее в выбранном вами графическом инструменте, либо вы можете создать их программно во время выполнения).

Если вы хотите сделать это программно, это может сделать следующий метод. Он создает изображение с выравниванием по центру, используя текст, который вы ему передаете, выполняя перенос слов.

UITabBarItem *item = [self.tabBar.items objectAtIndex:0];
item.image = [self makeThumbnailFromText:@"Tab Bar One"];
item.title = nil;

item = [self.tabBar.items objectAtIndex:1];
item.image = [self makeThumbnailFromText:@"Tab Bar Two"];
item.title = nil;

Здесь используется небольшой метод, который создает растровое изображение, отображая текст, который вы ему передаете. Возможно, вам придется поиграть с размерами изображений и размерами шрифта, чтобы оптимизировать изображения контроллера панели вкладок.

- (UIImage *)makeThumbnailFromText:(NSString *)string {
    // some variables that control the size of the image we create, what font to use, etc.

    CGSize imageSize = CGSizeMake(60, 80);
    CGFloat fontSize = 13.0;
    NSString *fontName = @"Helvetica-Bold";
    UIFont *font = [UIFont fontWithName:fontName size:fontSize];
    CGFloat lineSpacing = fontSize * 1.2;

    // set up the context and the font

    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0);
    NSDictionary *attributes = @{NSFontAttributeName: font};

    // some variables we use for figuring out the words in the string and how to arrange them on lines of text

    NSArray <NSString *> *words = [string componentsSeparatedByString:@" "];
    NSMutableArray <NSDictionary *> *lines = [NSMutableArray array];
    NSString *lineThusFar;
    CGSize sizeThusFar = CGSizeZero;

    // let's figure out the lines by examining the size of the rendered text and seeing whether it fits or not and
    // figure out where we should break our lines (as well as using that to figure out how to center the text)

    for (NSString *word in words) {
        NSString *currentLine = lineThusFar ? [NSString stringWithFormat:@"%@ %@", lineThusFar, word] : word;
        CGSize size = [currentLine sizeWithAttributes: attributes];
        if (size.width > imageSize.width && lineThusFar) {
            [lines addObject:@{@"text": lineThusFar, @"size": [NSValue valueWithCGSize: sizeThusFar]}];
            lineThusFar = word;
            sizeThusFar = [word sizeWithAttributes: attributes];
        } else {
            lineThusFar = currentLine;
            sizeThusFar = size;
        }
    }
    if (lineThusFar) {
        [lines addObject:@{@"text": lineThusFar, @"size": [NSValue valueWithCGSize: sizeThusFar]}];
    }

    // now write the lines of text we figured out above

    CGFloat totalSize = (lines.count - 1) * lineSpacing + fontSize;
    CGFloat topMargin = (imageSize.height - totalSize) / 2.0;

    for (NSInteger i = 0; i < lines.count; i++) {
        CGFloat x = (imageSize.width - [lines[i][@"size"] CGSizeValue].width) / 2.0;
        CGFloat y = topMargin + i * lineSpacing;
        [lines[i][@"text"] drawAtPoint:CGPointMake(x, y) withAttributes: attributes];
    }

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

В Swift это может выглядеть так:

func makeThumbnailFromText(text: String) -> UIImage {
    // some variables that control the size of the image we create, what font to use, etc.

    struct LineOfText {
        var string: String
        var size: CGSize
    }

    let imageSize = CGSize(width: 60, height: 80)
    let fontSize: CGFloat = 13.0
    let fontName = "Helvetica-Bold"
    let font = UIFont(name: fontName, size: fontSize)!
    let lineSpacing = fontSize * 1.2

    // set up the context and the font

    UIGraphicsBeginImageContextWithOptions(imageSize, false, 0)
    let attributes = [NSFontAttributeName: font]

    // some variables we use for figuring out the words in the string and how to arrange them on lines of text

    let words = text.componentsSeparatedByString(" ")
    var lines = [LineOfText]()
    var lineThusFar: LineOfText?

    // let's figure out the lines by examining the size of the rendered text and seeing whether it fits or not and
    // figure out where we should break our lines (as well as using that to figure out how to center the text)

    for word in words {
        let currentLine = lineThusFar?.string == nil ? word : "\(lineThusFar!.string) \(word)"
        let size = currentLine.sizeWithAttributes(attributes)
        if size.width > imageSize.width && lineThusFar != nil {
            lines.append(lineThusFar!)
            lineThusFar = LineOfText(string: word, size: word.sizeWithAttributes(attributes))
        } else {
            lineThusFar = LineOfText(string: currentLine, size: size)
        }
    }
    if lineThusFar != nil { lines.append(lineThusFar!) }

    // now write the lines of text we figured out above

    let totalSize = CGFloat(lines.count - 1) * lineSpacing + fontSize
    let topMargin = (imageSize.height - totalSize) / 2.0

    for (index, line) in lines.enumerate() {
        let x = (imageSize.width - line.size.width) / 2.0
        let y = topMargin + CGFloat(index) * lineSpacing
        line.string.drawAtPoint(CGPoint(x: x, y: y), withAttributes: attributes)
    }

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image
}

А также

var item = tabBar.items![0]
item.image = makeThumbnailFromText("Tab Bar One")
item.title = nil;

item = tabBar.items![1]
item.image = makeThumbnailFromText("Tab Bar Two")
item.title = nil;
person Rob    schedule 28.06.2012
comment
@Pach Я обновил свой ответ некоторым кодом, который вы теоретически могли бы использовать для создания изображений во время выполнения. Возможно, проще сделать это в Photoshop или любом другом инструменте, который вы хотите. - person Rob; 29.06.2012
comment
Роберт, я получил ошибку необъявленного идентификатора kTextKey, я что-то упустил? - person Pach; 04.07.2012
comment
@Pach да, поскольку мы создаем этот массив элементов словаря, нам просто нужны два случайных уникальных идентификатора для ключей словаря. На самом деле не имеет значения, что это такое, но я обновил код, чтобы отразить то, что вы могли бы использовать. - person Rob; 04.07.2012
comment
@ Роб, у тебя есть быстрая реализация того же самого? - person Saty; 28.04.2016
comment
@Saty Обновлен с портом Swift (и одновременно улучшенным примером Objective-C для создания изображений сетчатки). - person Rob; 28.04.2016

Для Swift 3

// мой центральный элемент - только изображение, а остальные элементы панели вкладок - только текст

 let tabs = CustomTabBarController();
 tabs.viewControllers = [ViewControllerOne(),ViewControllerTwo(),ViewControllerThree()]

    let tabbar = tabs.tabBar;
    tabbar.backgroundColor = UIColor.white

    let tabOne = tabbar.items![0]
    tabOne.title = "One"

    let tabTwo = tabbar.items![1]
    tabTwo.imageInsets = UIEdgeInsetsMake(6, 0, -6, 0);
    tabTwo.image = UIImage(named: "tab_icon.png")

    let tabThree = tabbar.items![2]
    tabThree.title = "Three"

//и в моем CustomTabBarController

 import UIKit

 class CustomTabBarController: UITabBarController {

override func viewDidLoad() {
    super.viewDidLoad()

    UITabBar.appearance().tintColor = UIColor.black
      UITabBarItem.appearance().titlePositionAdjustment = UIOffset(horizontal: 0, vertical: -15)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(true)
    self.selectedIndex = 1;
}

override var selectedViewController: UIViewController? {
    didSet {

        guard let viewControllers = viewControllers else {
            return
        }

        for viewController in viewControllers {

            if viewController == selectedViewController {

                let selected: [String: AnyObject] =
                    [NSFontAttributeName:fontForTimesRoman(withStyle: "bold", andFontsize: 12),
                     NSForegroundColorAttributeName: UIColor.black]

                viewController.tabBarItem.setTitleTextAttributes(selected, for: .normal)

            } else {

                let normal: [String: AnyObject] =
                    [NSFontAttributeName: fontForTimesRoman(withStyle: "regular", andFontsize: 12),
                     NSForegroundColorAttributeName: UIColor.gray]

                viewController.tabBarItem.setTitleTextAttributes(normal, for: .normal)

              }
           }
       }
   }


   func fontForTimesRoman(withStyle style: String, andFontsize size: CGFloat) -> UIFont {
if (style == "bold") {
    return UIFont(name: "TimesNewRomanPS-BoldMT", size: size)!
}
else if(style == "italic"){
    return UIFont(name: "TimesNewRomanPS-ItalicMT", size: size)!
}
else{
    return UIFont(name: "TimesNewRomanPSMT", size: size)!
  }

  }
  }
person Tanuj Jagoori    schedule 28.08.2017

Чтобы скрыть значок / изображение элемента панели вкладок в Xcode 10 и swift 12, выберите элемент панели вкладок, а затем:

1) Показать инспектор атрибутов
2) Установите «Системный элемент» со значением «Пользовательский». "
3) Пусть "Выбранное изображение" и атрибуты будут пустыми
4) Пусть атрибут "Bar Item -> Image" будет пустым

Вот и все, чтобы скрыть.
Я пока не знаю, как выровнять по вертикали, но если узнаю, как это сделать, вернусь и дополню ответ.
См. изображения Упомянутого по ссылке: Могу ли я отображать текст только в элементе панели вкладок и изменять стиль и положение

person Andre    schedule 23.04.2019