Додавання UILabel до панелі UITool


97

Я намагаюся додати мітку на свою панель інструментів. Кнопка чудово працює, проте коли я додаю об’єкт мітки, він виходить з ладу. Якісь ідеї?

UIBarButtonItem *setDateRangeButton = [[UIBarButtonItem alloc] initWithTitle:@"Set date range"
                                                                       style:UIBarButtonItemStyleBordered
                                                                      target:self
                                                                      action:@selector(setDateRangeClicked:)];

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(5, 5, 20, 20)];
label.text = @"test";

[toolbar setItems:[NSArray arrayWithObjects:setDateRangeButton,label, nil]];

// Add the toolbar as a subview to the navigation controller.
[self.navigationController.view addSubview:toolbar];

// Reload the table view
[self.tableView reloadData];

Відповіді:


128

Погляньте на це

[[UIBarButtonItem alloc] initWithCustomView:yourCustomView];

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

NSMutableArray *items = [[self.toolbar items] mutableCopy];

UIBarButtonItem *spacer = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer];
[spacer release];

self.titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0 , 11.0f, self.view.frame.size.width, 21.0f)];
[self.titleLabel setFont:[UIFont fontWithName:@"Helvetica-Bold" size:18]];
[self.titleLabel setBackgroundColor:[UIColor clearColor]];
[self.titleLabel setTextColor:[UIColor colorWithRed:157.0/255.0 green:157.0/255.0 blue:157.0/255.0 alpha:1.0]];
[self.titleLabel setText:@"Title"];
[self.titleLabel setTextAlignment:NSTextAlignmentCenter];

UIBarButtonItem *spacer2 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
[items addObject:spacer2];
[spacer2 release];

UIBarButtonItem *title = [[UIBarButtonItem alloc] initWithCustomView:self.titleLabel];
[items addObject:title];
[title release];

[self.toolbar setItems:items animated:YES];
[items release];

10
Зауважте, що якщо ви вирішили пройти цей маршрут, ви повинні належним чином розмістити свою мітку (label.backgroundColor = [UIColor clearColor] тощо). Ви також можете запустити UIBarButtonItem, щоб він був стильним рівнем, який надасть вам схожий вигляд
smartquark

Я знаю, що це дійсно старий пост, але у мене є питання щодо цієї відповіді. Як тільки це буде зроблено, чи є спосіб отримати доступ до titleLabel пізніше, щоб змінити його, або це неможливо, оскільки все було випущено?
Райан

Райан, UILabel, ймовірно, існує досі - це self.titleLabel. Цей приклад потребує властивості, оголошеної та синтезованої для UILabel * titleLabel, але цей код не відображається. Якщо у вас є доступ до об'єкта (можливо, UIViewController), який виконує цей код, ви можете отримати доступ до його titleLabel. Наприклад, ви можете додати метод на контролер перегляду, передати новий потрібний заголовок і потім зателефонувати [self.titleLabel setText: newTitle].
Стів Ліддл

7
Не хочете, щоб другий проставку було додано після елемента рядка кнопки заголовка?
LEN

121

Для тих, хто використовує програму Interface Builder для компонування вашого UIToolBar , це також можна зробити, використовуючи Інтерфейс Builder поодинці.

Для того, щоб додати UILabelдо UIToolBarвас виникла необхідність створення загальний UIViewоб'єкт до вашого UIToolBarв IB, перетягнувши новий UIViewоб'єкт над вашим UIToolBar. IBавтоматично створить файл, UIBarButtonItemякий буде ініціалізований із вашим користувальницьким UIView. Далі додайте UILabelдо UIViewта UILabelграфічно відредагуйте, щоб відповідати бажаному стилю. Потім ви зможете візуально встановити фіксовані та / або змінні розпірки за своїм бажанням для розташування свогоUILabel належним чином.

Крім того, необхідно встановити фон як UILabelі UIViewдля , clearColorщоб отримати , UIToolBarщоб показати через правильно під UILabel.


2
Хороший трюк, я не знав, що ви можете це зробити в Interface Builder. Велике спасибі.
Рафаель Бугаєвський

Чи є спосіб додати UIButton до власного зображення за допомогою цього методу? Я можу додати UIButton, але зображення не відображається.
cannyboy

4
Я не можу зробити так, щоб це спрацювало. Коли я перетягую UIView на панель інструментів, він поміщається всередину контролера перегляду, а не на панелі інструментів. Також чи робимо це ми в навігаційному контролері чи в контролері перегляду?
Гуптрон

1
Це, здається, не працює. Якби це працювало колись давно, вже не в XCode 6 ...
Frédéric Adda

1
Вам слід оновити свою відповідь, щоб вказати, що це працює лише з панелями інструментів, доданими до контролера перегляду вручну; вона не працює з доданою для вас панеллю інструментів.
Джеймс Буш

32

Я вважав, що відповідь відповіді є дуже корисною, але я думаю, що знайшов ще простіший спосіб у програмі Interface Builder:

  • створіть UIBarButtonItem та додайте його на панель інструментів у програмі Interface Builder

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

  • Зніміть прапорець "Увімкнено" для цього BarButtonItem

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

  • підключіть цей BarButtonItem до властивості у вашому класі (це у Swift, але було б дуже схоже на Obj-C):

    @IBOutlet private weak var lastUpdateButton: UIBarButtonItem! // Dummy barButtonItem whose customView is lastUpdateLabel
  • додайте ще одну властивість для самої мітки:

    private var lastUpdateLabel = UILabel(frame: CGRectZero)
  • у viewDidLoad, додайте наступний код для встановлення властивостей вашої мітки та додайте її як customView вашого BarButtonItem

    // Dummy button containing the date of last update
    lastUpdateLabel.sizeToFit()
    lastUpdateLabel.backgroundColor = UIColor.clearColor()
    lastUpdateLabel.textAlignment = .Center
    lastUpdateButton.customView = lastUpdateLabel
  • Щоб оновити UILabelтекст:

    lastUpdateLabel.text = "Updated: 9/12/14, 2:53"
    lastUpdateLabel.sizeToFit() 

Результат:

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

Вам потрібно дзвонити lastUpdateLabel.sizetoFit()кожен раз, коли ви оновлюєте текст етикетки


1
Я створив UIBarButtonItem такий же, як і ви, залишив його ввімкненим і наклав ярлик, використовуючи наступний код: UILabel* label = [[UILabel alloc] init]; label.text = @"Hello"; label.font = [UIFont systemFontOfSize:16]; [label sizeToFit]; self.barItem.customView = label;
Brett Donald

6

Однією з речей, для якої я використовую цей трюк, є інстанція UIActivityIndicatorViewна вершині UIToolBar, що інакше було б неможливо. Наприклад, тут у мене є UIToolBar2 UIBarButtonItem, a FlexibleSpaceBarButtonItem, а потім інший UIBarButtonItem. Я хочу , щоб вставити UIActivityIndicatorViewв UIToolBarміж гнучким простором і кнопками остаточної (правої). Тож у своєму виконанні RootViewControllerя роблю наступне,

- (void)viewDidLoad {
[super viewDidLoad];// Add an invisible UIActivityViewIndicator to the toolbar
UIToolbar *toolbar = (UIToolbar *)[self.view viewWithTag:767];
NSArray *items = [toolbar items];

activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 20.0f, 20.0f)];
[activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhite];    

NSArray *newItems = [NSArray arrayWithObjects:[items objectAtIndex:0],[items objectAtIndex:1],[items objectAtIndex:2],
                     [[UIBarButtonItem alloc] initWithCustomView:activityIndicator], [items objectAtIndex:3],nil];
[toolbar setItems:newItems];}

Цей код протікає з пам'яттю, виділеною для UIBarButtonItem, за допомогою спеціального перегляду індикатора активності. (Він також просочує пам'ять індикатора активності, але я припускаю, що він випускається внизу в кінці фрагмента коду.
erikprice

3

Деталі

  • Xcode 10.2.1 (10E1001), Swift 5

Повний зразок

import UIKit

class ViewController: UIViewController {

    private weak var toolBar: UIToolbar?

    override func viewDidLoad() {
        super.viewDidLoad()

        var bounds =  UIScreen.main.bounds
        let bottomBarWithHeight = CGFloat(44)
        bounds.origin.y = bounds.height - bottomBarWithHeight
        bounds.size.height = bottomBarWithHeight
        let toolBar = UIToolbar(frame: bounds)
        view.addSubview(toolBar)

        var buttons = [UIBarButtonItem]()
        buttons.append(UIBarButtonItem(barButtonSystemItem: .add, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .camera, target: self, action: #selector(ViewController.action)))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(ToolBarTitleItem(text: "\(NSDate())", font: .systemFont(ofSize: 12), color: .lightGray))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil))
        buttons.append(UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action:  #selector(ViewController.action)))
        toolBar.items = buttons

        self.toolBar = toolBar
    }
    @objc func action() { print("action") }
}

class ToolBarTitleItem: UIBarButtonItem {

    init(text: String, font: UIFont, color: UIColor) {
        let label =  UILabel(frame: UIScreen.main.bounds)
        label.text = text
        label.sizeToFit()
        label.font = font
        label.textColor = color
        label.textAlignment = .center
        super.init()
        customView = label
    }
    required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) }
}

Результат

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


Мені це подобається, але що робити, якщо у мене TableView, то він буде прокручуватися за допомогою цієї панелі. Як це виправити?
Максим Князєв

Привіт Максиме, я не можу зрозуміти вашу проблему. Опишіть, будь ласка, результат, який ви хочете отримати.
Василь Боднарчук

Гаразд, я використовую UITableViewController, і якщо я встановлю view.addSubview (toolBar!) І прокручую моє перегляд таблиці, то панель прокручуватиметься з tableView, я хочу, щоб вона мала фіксовану нижню позицію
Максим Князєв,

Думаю, вам слід використовувати UIViewController з UITableView (замість UITableViewController) як підпогляд.
Василь Боднарчук

Добре спасибо. Я спробую це
Максим Князєв

2

Схожий на Matt RI використовується конструктор інтерфейсів. Але я хотів мати 1 UIWebViewвсередині, щоб я міг мати текст, виділений жирним шрифтом, а інший - ні (як поштовий додаток). Так

  1. Замість цього додайте веб-перегляд.
  2. Зніміть прапорець
  3. Переконайтесь, що фон має чіткий колір
  4. Гачок все з IBOutlet
  5. Використовуйте нижче, htmlщоб мати прозорий фон, щоб панель інструментів просвічувалась

Код:

NSString *path = [[NSBundle mainBundle] bundlePath];
NSURL *baseURL = [NSURL fileURLWithPath:path];
NSString *html = [NSString stringWithFormat:@"<html><head><style>body{font-size:11px;text-align:center;background-color:transparent;color:#fff;font-family:helvetica;vertical-align:middle;</style> </head><body><b>Updated</b> 10/11/12 <b>11:09</b> AM</body></html>"];
[myWebView loadHTMLString:html baseURL:baseURL];

1

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

[self.navigationController.tabBarController.view addSubview:yourView];

1

Спробуйте це:

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(140 , 0, 50, 250)];
[label setBackgroundColor:[UIColor clearColor]];
label.text = @"TEXT";
UIView *view = (UIView *) label;
[self.barItem setCustomView:view];

Примітка: self.barItemєUIBarButtonItem додано з бібліотеки об'єктів і поміщається між двома гнучкими просторами.

інший спосіб - видалити [self.barItem setCustom:view]рядок і змінити параметри label(ширини), щоб він заповнив всю панель інструментів і встановив вирівнювання посередині та шрифту самостійно в коді,

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